使用 Elasticsearch Java API 检索特定字段
我将 Java API 用于 Elasticsearch.将实体保存到索引中后,可以将它们与完整的源一起检索.但是,我只想检索选定的字段,这是行不通的.
I am using the Java API for Elasticsearch. Having saved entities into indexes, it is possible to retrieve them together with the complete source. However, I only want to retrieve selected fields, and that is not working.
以下示例代码:
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();
}
将从索引中检索正确的实体,包括完整的来源.
will retrieve the correct entities from the index, including the complete source.
例如,这是响应的片段:
For example, this is a snippet of the response :
"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
为空.
However, while response.getHits()
returns the expected number of hits, the fields
and source
within each hit is empty.
我希望每个命中都包含该行中指定的字段:
I am expecting each hit to contain the field specified in the line:
.addFields("field1")
注释掉该行
.setFetchSource(true)
将导致响应根本不包含源.
will cause the response not to include the source at all.
Elasticsearch 的版本是 1.5.0
The version of Elasticsearch is 1.5.0
以下是Java API的maven依赖:
The following is the maven dependency the Java API:
<dependency>
<groupId>com.sksamuel.elastic4s</groupId>
<artifactId>elastic4s_2.11</artifactId>
<version>1.5.5</version>
</dependency>
显然,出于性能原因,我不想检索完整的实体.有谁知道如何将检索限制为选定的字段?谢谢
Obiously, for performance reasons, I don't want to have to retrieve the complete entity. Does anyone know how to limit the retrieval to selected fields? Thanks
您可以使用 setFetchSource(String[] 包括,String[] 排除)
方法.试试这个
You can specify the fields you need using the setFetchSource(String[] includes, String[] excludes)
method. Try this instead
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
将只包含您指定的字段.
map
will only contain the fields you've specified.
请注意 .setFetchSource("field1", null)
(如果您需要单个字段)或 .setFetchSource("field*", null)
(如果您需要需要几个通配符字段)也可以.
Note that .setFetchSource("field1", null)
(if you need a single field) or .setFetchSource("field*", null)
(if you need several wildcarded fields) would work, too.