我正在使用Java API进行Elasticsearch。 将实体保存到索引中后,可以将它们与完整的源一起检索。但是,我只想检索选定的字段,但这不起作用。
以下示例代码:
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();
}
将从索引中检索正确的实体,包括完整的源。
例如,这是响应的片段:
"hits" : {
"total" : 1301,
"max_score" : 0.99614644,
"hits" : [ {
"_index" : "my-index",
"_type" : "my-type",
"_id" : "AU2P68COpzIypBTd80np",
"_score" : 0.99614644,
"_source":{"field1":"1234", ...}]}
}, {
但是,当response.getHits()
返回预期的点击次数时,每次点击中的fields
和source
都是空的。
我希望每次点击都包含该行中指定的字段:
.addFields("field1")
评论该行
.setFetchSource(true)
将导致响应完全不包括源。
Elasticsearch的版本是1.5.0
以下是Java API的maven依赖:
<dependency>
<groupId>com.sksamuel.elastic4s</groupId>
<artifactId>elastic4s_2.11</artifactId>
<version>1.5.5</version>
</dependency>
很明显,出于性能原因,我不想检索完整的实体。 有谁知道如何限制检索到选定的字段? 感谢
答案 0 :(得分:38)
您可以使用setFetchSource(String[] includes, String[] excludes)
method指定所需的字段。试试这个
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
只会包含您指定的字段。
请注意,.setFetchSource("field1", null)
(如果您需要单个字段)或.setFetchSource("field*", null)
(如果您需要多个通配字段)也可以。