【问题标题】:Elasticsearch Multi Get working through curl, but no results are returned through Java APIElasticsearch Multi 通过 curl 工作,但没有通过 Java API 返回结果
【发布时间】:2017-05-09 14:24:09
【问题描述】:

我正在运行 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");

我做错了什么?对 elasticsearch 进行休息调用证明日志存在,但我的 Java 调用在某种程度上是错误的。

【问题讨论】:

  • 你为什么在 request.add("logs-2017-04-30", null, "e72927c2-751c-4b33-86de-44a494abf78f") 的 java 请求中将 type 作为 null 提供?您应该提供类型或_all
  • @avr API 确实允许它为 null,github.com/elastic/elasticsearch/blob/master/core/src/main/java/…,但我返回并将类型添加到 curl 命令和 Java MultiGetRequestBuilder.add 命令并看到相同的行为。它适用于 curl 调用,但在 Java 调用中失败。

标签: elasticsearch elasticsearch-2.0 elasticsearch-5 elasticsearch-java-api


【解决方案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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    相关资源
    最近更新 更多