我对弹性搜索的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 elasticsearch 1.4.0
我的数据看起来像
{
"_index": "bookings",
"_type": "booking",
"_id": "50245171",
"_score": 1,
"_source": {
"field1": "value1",
"field2": "value2",
"field3": "value3",
...
}
}
答案 0 :(得分:5)
您是否尝试过将.addFields()添加到查询中?
SearchResponse searchResponse = client.prepareSearch().setQuery(query).addFields("field1", "field2",...).execute().actionGet();
我不确定所有细节,但我相信elasticsearch会尽可能少地向您发送数据。这是有道理的,因为它应该快速而轻盈。
无论如何,您是否有机会索引预订对象?因为如果您再次需要整个对象,您还可以获取源并将其转换回原始的Booking对象。例如:
ObjectMapper mapper = new ObjectMapper();
Booking booking = mapper.readValue(hit.getSourceAsString(), Booking.class);
ObjectMapper来自com.fasterxml.jackson.databind.ObjectMapper(我认为应该包含在elasticsearch中)。
答案 1 :(得分:1)
字段没有以字段形式响应....
hit.getSource()
我收到了我的信息
答案 2 :(得分:1)
匹配的字段部分包括您明确要求的字段,默认情况下为none。您可以使用addField()或addFields()将一个或多个字段添加到请求中。这应该为您填充响应中的字段。
每个匹配中的源包含整个原始对象,因此可能包含您不需要的数据。以这种方式返回源通常会被关闭以防止发送这些多余的数据。
答案 3 :(得分:0)
QueryBuilders.matchQuery()
似乎仅适用于字段
“_ type”是索引的内置属性...
尝试类似的东西:
client.prepareSearch("bookings")
.setTypes("booking")
.setQuery(query)
.execute()
.actionGet();
您的查询必须基于您的文档字段