Elasticsearch Multi Get通过curl工作,但是通过JavaAPI没有返回结果

Elasticsearch Multi Get working through curl, but no results are returned through Java API

我是运行 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"
        }
    ]
}'

当我想从该响应中拉出 "message" 字段时,我使用此请求:

curl 'localhost:9200/_mget' -d '{
    "docs" : [
        {
            "_index" : "logs-2017-04-30",
            "_id" : "e72927c2-751c-4b33-86de-44a494abf78f",
            "fields" : ["message"]
        }
    ]
}'

以上两个查询return我要找的日志和信息

但是当我尝试将其翻译成 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"); <--- returns null

我做错了什么?对 elasticsearch 进行 rest 调用证明日志存在,但我的 Java 调用不知何故是错误的。

documentation page for the Java multi get 完全跳过了检索 _source 字段之外的数据所需的额外语法。就像 REST API 一样,使用定位日志所需的最少信息进行多次获取 获取的相关信息非常有限 。为了通过 Java API 在 multi 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");