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