使用 Elasticsearch Java API 检索特定字段 [英] Retrieving specific fields using the Elasticsearch Java API

查看:60
本文介绍了使用 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() 返回预期的命中数,但每个命中中的 fieldssource 为空.

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.

这篇关于使用 Elasticsearch Java API 检索特定字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆