簡體   English   中英

如何使用Spring Data從Elasticsearch中讀取文檔?

[英]How to read documents from elasticsearch using Spring Data?

我創建了一個索引(房屋),其類型為“公寓”,其中包含20個文檔。 我使用郵遞員將Json作為二進制文件上傳到elasticsearch中。 我有一個具有以下類的Spring Boot項目:

  1. EsConfig.java-我已經配置了clustername,這是application.properties文件中的默認名稱。

     @Configuration @EnableElasticsearchRepositories(basePackages = "com.search.repository") public class EsConfig { @Value("${elasticsearch.clustername}") private String EsClusterName; @Bean public Client esClient() throws UnknownHostException { Settings esSettings = Settings.builder() .put("cluster.name", EsClusterName) .put("client.transport.sniff", true) .put("client.transport.ignore_cluster_name", false) .build(); TransportClient client = new PreBuiltTransportClient(esSettings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); return client; } @Bean public ElasticsearchOperations elasticsearchTemplate() throws Exception{ return new ElasticsearchTemplate(esClient()); } } 
  2. Apartments.java-這是我的數據模型。 這些文件在elasticsearch中具有以下字段。

     @Document(indexName = "house", type = "apartments") @JsonIgnoreProperties(ignoreUnknown=true) public class Apartments { @Id private String id; @JsonProperty("Apartment_Name") private String apartmentName; @JsonProperty("Apartment_ID") private String apartmentId; @JsonProperty("Area_Name") private String areaName; //constructors along with getters and setters } 
  3. ApartmentSearchRepository.java-這是擴展ElasticsearchRepository接口以執行原始操作的接口。

     public interface ApartmentSearchRepository extends ElasticsearchRepository<Apartments, String> { List<Apartments> findByApartmentName(String apartmentName); } 
  4. EsApartmentService.java-

     @Service public class EsApartmentService { @Autowired ApartmentSearchRepository apartmentSearchRepository; public List<Apartments> getApartmentByName(String apartmentName) { return apartmentSearchRepository.findByApartmentName(apartmentName); } } 
  5. ApartmentController.java-我創建了一個端點,該端點應從elasticsearch中退還那20個文檔。 (此外,Apartment是我的項目中的POJO,而Apartments是數據模型。)

     @Autowired EsApartmentService esApartmentService; @GetMapping(path = "/search",produces = "application/json") public Set<Apartment> searchApartmentByName( @RequestParam(value = "apartmentName", defaultValue = "") String apartmentName) throws IOException { List<Apartment> apartments= new ArrayList<>(); esApartmentService.getApartmentByName(apartmentName).forEach(apartment-> { apartments.add(new Apartment(apartment.getApartmentName(), apartment.getApartmentId(), apartment.getAreaName())); }); return apartments.stream() .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Apartment::getApartmentId)))); } 

此代碼返回狀態200,但響應為空。 我嘗試調試,但似乎無法從elasticsearch讀取這些文檔。 我經歷了幾個解決方案,但是大多數解決方案都是從代碼本身內部設置文檔數據的。

我無法通過點擊控制器中指定的端點來檢索這些文檔。 有人可以讓我知道我可能會錯過的東西嗎? 謝謝! :)

編輯:下面的屏幕快照顯示了Postman中的查詢和響應。 在此處輸入圖片說明

據我所知,您可以使用@JsonProperty將POJO映射到查詢響應,但是您失去了使用彈簧數據的動態查找器方法(findBy *)的能力。 彈簧數據的動態查找器生成依賴於反射,並且POJO中的字段名稱在其中變得很重要。

您介意更改POJO或文檔中的字段名稱以進行驗證嗎? 或者只是定義一個自定義查詢? 還有一個功能強大的Java API,您可以在其中定義更復雜的查詢: https : //docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.misc.filter

正如@ibexit上文所述,我刪除了@JsonProperty並在服務中使用了本機搜索查詢構建器。 另外,當我給apartment_Name時,它並沒有使用Apartment_Name並起作用。 (好像Elasticsearch遇到大小寫問題,所以我在Camel Case中給出了它。)

我的變更:

  1. Apartments.java-刪除@JsonProperty

     @Document(indexName = "house", type = "apartments") //@JsonIgnoreProperties(ignoreUnknown=true) public class Apartments { @Id private String id; //@JsonProperty("apartment_ID") private String apartment_ID; //@JsonProperty("Area_Name") private String area_Name; //@JsonProperty("Apartment_Name") private String apartment_Name; } 
  2. EsApartmentService.java-

     @Service public class EsApartmentService { @Autowired private ElasticsearchTemplate elasticsearchTemplate; public List<Apartments> getApartmentByName(String apartmentName) { SearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(org.elasticsearch.index.query.QueryBuilders .matchQuery("apartment_Name", apartmentName)).build(); Page<Apartments> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery,Apartments.class); return sampleEntities.getContent(); } } 
  3. 刪除了ApartmentSearchRepository.java文件。

這些更改給了我所需的回復! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM