【问题标题】:Elasticsearch Java API do not return fields of hitsElasticsearch Java API 不返回命中字段
【发布时间】:2014-11-26 13:37:14
【问题描述】:

我对 elasticsearch 的 java api 有疑问。

当我进行这样的搜索时:

MatchQueryBuilder query = QueryBuilders.matchQuery("_type", "booking");

SearchResponse searchResponse = client.prepareSearch().setQuery(query).execute().actionGet();

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

我的回复从来没有字段,有人可以帮助我吗?

我正在使用:

elasticsearch java api 1.4.0 弹性搜索 1.4.0

我的数据看起来像

{
  "_index": "bookings",
  "_type": "booking",
  "_id": "50245171",
  "_score": 1,
  "_source": {
    "field1": "value1",
    "field2": "value2",
    "field3": "value3",
    ...
  }
}

【问题讨论】:

    标签: java elasticsearch elasticsearch-java-api


    【解决方案1】:

    您是否尝试将 .addFields() 添加到您的查询中?

    SearchResponse searchResponse = client.prepareSearch().setQuery(query).addFields("field1", "field2",...).execute().actionGet();
    

    我不确定所有细节,但我相信 elasticsearch 会尝试向您发送尽可能少的数据。这是有道理的,因为它应该又快又轻。

    无论如何,您是否有机会为 Booking 对象编制索引?因为如果您再次需要整个对象,您也可以只获取源并将其转换回其原始 Booking 对象。例如:

    ObjectMapper mapper = new ObjectMapper();
    Booking booking = mapper.readValue(hit.getSourceAsString(), Booking.class);
    

    ObjectMapper 来自 com.fasterxml.jackson.databind.ObjectMapper(我相信应该包含在 elasticsearch 中)。

    【讨论】:

    • 我不知道您有哪个版本,但我无法使用 SearchResponse 或 SearchResponseBuilder 制作“.setFields("field1", "field2",...)"
    • 啊,对不起。我混合了这些方法。它应该是 addFields()。我现在在答案中修复了它。仍然 - 我不确定它是否有效。试一试...
    【解决方案2】:

    字段没有作为字段响应....

    hit.getSource() 我得到了我的信息

    【讨论】:

      【解决方案3】:

      命中的字段部分包括您明确要求的字段,默认情况下为无。您可以使用 addField() 或 addFields() 向请求中添加一个或多个字段。这应该会为您填充响应中的字段。

      每个命中的源包含整个原始对象,因此很可能包含您不需要的数据。以这种方式返回源通常会被关闭,以防止发送过多的数据。

      【讨论】:

        【解决方案4】:

        QueryBuilders.matchQuery()

        似乎只适用于字段

        “_type”是索引的内置属性...

        试试这样的:

            client.prepareSearch("bookings")
              .setTypes("booking")
              .setQuery(query)
              .execute()
              .actionGet();
        

        您的查询必须基于您的文档字段

        【讨论】:

        • 你是对的,但搜索结果是一样的......仍然没有字段
        猜你喜欢
        • 1970-01-01
        • 2020-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-22
        • 2012-07-03
        • 2015-06-11
        • 2017-01-17
        相关资源
        最近更新 更多