2015-05-27 19 views
9

Tôi đang sử dụng API Java cho Elasticsearch. Có các thực thể đã lưu vào các chỉ mục, có thể truy xuất chúng cùng với nguồn hoàn chỉnh. Tuy nhiên, tôi chỉ muốn truy xuất các trường đã chọn và không hoạt động.Truy xuất các trường cụ thể bằng cách sử dụng API Java của Elasticsearch

Mẫu mã folowing:

SearchResponse response = client.prepareSearch("my-index") 
    .setTypes("my-type") 
    .setSearchType(SearchType.QUERY_AND_FETCH) 
    .setFetchSource(true) 
    .setQuery(QueryBuilders.termsQuery("field1", "1234")) 
    .addFields("field1") 
    .execute() 
    .actionGet(); 

for (SearchHit hit : response.getHits()){ 
    Map<String, SearchHitField> fields = hit.getFields(); 
    System.out.println(fields.size()); 
    Map map = hit.getSource(); 
    map.toString(); 
} 

sẽ lấy các thực thể đúng từ chỉ số, bao gồm cả nguồn hoàn chỉnh.

Ví dụ, đây là một đoạn của phản ứng:

"hits" : { 
    "total" : 1301, 
    "max_score" : 0.99614644, 
    "hits" : [ { 
    "_index" : "my-index", 
    "_type" : "my-type", 
    "_id" : "AU2P68COpzIypBTd80np", 
    "_score" : 0.99614644, 
    "_source":{"field1":"1234", ...}]} 
}, { 

Tuy nhiên, trong khi response.getHits() trả về số dự kiến ​​của hit, các fieldssource trong mỗi hit trống.

Tôi hy vọng mỗi hit để chứa các lĩnh vực quy định tại dòng:

.addFields("field1") 

Bình luận ra các dòng

.setFetchSource(true) 

sẽ gây ra phản ứng không bao gồm nguồn ở tất cả.

Các phiên bản của Elasticsearch là 1.5.0

Sau đây là maven phụ thuộc API Java:

<dependency> 
    <groupId>com.sksamuel.elastic4s</groupId> 
    <artifactId>elastic4s_2.11</artifactId> 
    <version>1.5.5</version> 
</dependency> 

Obiously, vì lý do hiệu suất, tôi không muốn phải lấy trọn vẹn thực thể. Có ai biết cách giới hạn truy xuất đến các trường đã chọn không? Cảm ơn

Trả lời

30

Bạn có thể chỉ định các trường bạn cần sử dụng setFetchSource(String[] includes, String[] excludes) method. Hãy thử thay thế này thay vì

SearchResponse response = client.prepareSearch("my-index") 
    .setTypes("my-type") 
    .setSearchType(SearchType.QUERY_AND_FETCH) 
    .setFetchSource(new String[]{"field1"}, null) 
    .setQuery(QueryBuilders.termsQuery("field1", "1234")) 
    .execute() 
    .actionGet(); 

for (SearchHit hit : response.getHits()){ 
    Map map = hit.getSource(); 
    map.toString(); 
} 

map sẽ chỉ chứa các trường bạn đã chỉ định.

Lưu ý rằng .setFetchSource("field1", null) (nếu bạn cần một trường đơn lẻ) hoặc .setFetchSource("field*", null) (nếu bạn cần một số trường ký tự đại diện) cũng sẽ hoạt động.

+3

@ user1052610 bạn có thể sử dụng giải pháp được đề xuất không? – Val

+0

Không hoạt động với tôi với ElasticSearch 5.x. :( Nó trả về trường "_source" trống trong phản hồi và không sao chép "field1" dưới dạng trường thực. – cs94njw

+0

@ cs94njw Điều đó không được thay đổi [theo nguồn] (https: // github. com/elastic/elasticsearch/blob/c98e3f60f78fb47ae7482d96952f2dbabd1d6d49/core/src/main/java/org/elasticsearch/action/get/GetRequestBuilder.java # L127-L131) Hãy tạo một câu hỏi mới tham chiếu câu hỏi này, để chúng ta có thể sắp xếp nó ra. – Val

Các vấn đề liên quan