使用rest客户端的Elasticsearch批量插入

时间:2017-04-11 07:13:40

标签: java rest elasticsearch

为了提高性能,我希望将文档批量发送到Elasticsearch,而不是一个一个地发送。我在https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-bulk.html

了解了弹性批量API

但是,我使用的是Elasticsearch rest-client(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进行批量插入?

2 个答案:

答案 0 :(得分:13)

是的,这是正确的,现在REST客户端只允许向ES发送原始REST查询,但没有太复杂。 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
}

答案 1 :(得分:0)

除了Val回答之外的另一个例子: here

只需使用POST而不是PUT(使用rest模板时要小心.exchange)