3

我对 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());
}

我的回答从来没有字段,有人可以帮助我吗? 在此处输入图像描述

我在用:

弹性搜索 java api 1.4.0 弹性搜索 1.4.0

我的数据看起来像

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

4 回答 4

5

您是否尝试将 .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 中)。

于 2014-11-26T14:03:53.933 回答
1

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

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

于 2014-11-26T14:46:46.533 回答
1

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

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

于 2015-11-09T09:46:50.523 回答
0

QueryBuilders.matchQuery()

似乎只适用于字段

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

尝试这样的事情:

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

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

于 2014-11-26T13:59:07.693 回答