2017-04-11 50 views
2

爲了提高性能,我希望將文檔批量發送到Elasticsearch,而不是逐個發送。我已閱讀關於彈性批量API的https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-bulk.htmlElasticsearch使用其餘客戶端的批量插入

但是,我正在使用Elasticsearch其餘客戶端(https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html),並且找不到有關如何進行批量插入的任何示例或文檔。我能找到的只是通過運輸客戶的大量請求。

我想我必須準備這裏描述的請求正文(https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html)並將其傳遞給restclient的performRequest方法?有沒有其他方法,例如ES java rest-client庫中的構建器機制,使用rest來進行批量插入?

回答

8

是的,這是正確的,現在REST客戶端只允許將原始REST查詢發送給ES,但沒有太複雜的東西。 Elastic正在開發高級客戶端,它將在REST客戶端之上工作,並允許您發送DSL查詢等。

現在,您可以使用以下示例代碼來批量發送文檔到您的ES服務器:

RestClient client = ...; 
String actionMetaData = String.format("{ \"index\" : { \"_index\" : \"%s\", \"_type\" : \"%s\" } }%n", index, type); 

List<String> bulkData = ...; // a list of your documents in JSON strings  
StringBuilder bulkRequestBody = new StringBuilder(); 
for (String bulkItem : bulkData) { 
    bulkRequestBody.append(actionMetaData); 
    bulkRequestBody.append(bulkItem); 
    bulkRequestBody.append("\n"); 
} 
HttpEntity entity = new NStringEntity(bulkRequestBody.toString(), ContentType.APPLICATION_JSON); 
try { 
    Response response = client.performRequest("POST", "/your_index/your_type/_bulk", Collections.emptyMap(), entity); 
    return response.getStatusLine().getStatusCode() == HttpStatus.SC_OK; 
} catch (Exception e) { 
    // do something 
}