0

我正在运行elasticsearch 2.3.4,但在5.x中语法似乎没有改变。Elasticsearch Multi通过curl获得工作,但没有结果通过Java API返回

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"] 
     } 
    ] 
}' 

以上两种查询返回的日志和我正在寻找的信息。

但是,当我试图像这样转换为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

为什么要给'type'为'null'在行'你的java请求request.add( “日志 - 2017年4月30日”,NULL,“e72927c2-751c-4b33-86de -44a494abf78f“)'?你应该提供类型或'_all'! – avr

+0

@avr API确实允许它为空,https://github.com/elastic/elasticsearch/blob/master/core/src/main/java/org/elasticsearch/action/get/MultiGetRequestBuilder.java#L47,但我回去并将类型添加到curl命令和Java MultiGetRequestBuilder.add命令中,并看到相同的行为。它在curl调用上工作并在Java调用中失败。 – Shadoninja

回答

0

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");