我正在运行elasticsearch 2.3.4,但5.x中的语法似乎没有改变。
Multiget over curl工作得很好。这是我的卷发的样子:
curl 'localhost:9200/_mget' -d '{
"docs" : [
{
"_index" : "logs-2017-04-30",
"_id" : "e72927c2-751c-4b33-86de-44a494abf78f"
}
]
}'
当我想要提取"消息"关闭该响应,我使用此请求:
curl 'localhost:9200/_mget' -d '{
"docs" : [
{
"_index" : "logs-2017-04-30",
"_id" : "e72927c2-751c-4b33-86de-44a494abf78f",
"fields" : ["message"]
}
]
}'
上述两个查询都会返回我要查找的日志和信息。
但是当我尝试将它翻译成Java时:
MultiGetRequestBuilder request = client.prepareMultiGet();
request.add("logs-2017-04-30", null, "e72927c2-751c-4b33-86de-44a494abf78f");
MultiGetResponse mGetResponse = request.get();
for (MultiGetItemResponse itemResponse : mGetResponse.getResponses()) {
GetResponse response = itemResponse.getResponse();
logger.debug("Outputing object: " + ToStringBuilder.reflectionToString(response));
}
我似乎得到了空对象。当我尝试从看起来空的GetResponse对象中获取消息字段时,没有任何内容:
GetField field = response.getField("message");
< ---返回null
我做错了什么?对elasticsearch进行休息调用证明日志存在,但我的Java调用在某种程度上是错误的。
答案 0 :(得分:1)
documentation page for the Java multi get完全跳过了检索_source字段之外的数据所需的额外语法。就像REST API一样,使用查找日志所需的最少信息进行多次获取获取有关它的非常有限的信息。为了通过Java API从多个get调用中的日志中获取特定字段,必须将MultiGetRequest.Item传递给构建器。在执行请求之前,此项需要包含您在其中指定的字段。
以下是代码更改(为清晰起见分为多行),在我进行查询时会产生我想要的字段:
MultiGetRequestBuilder request = client.prepareMultiGet();
MultiGetRequest.Item item = new MultiGetRequest.Item("logs-2017-04-30", "null", "e72927c2-751c-4b33-86de-44a494abf78f");
item.fields("message");
request.add(item);
MultiGetResponse mGetResponse = request.get();
现在我可以要求我之前指定的字段:
GetField field = response.getField("message");