为了提高性能,我希望将文档批量发送到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进行批量插入?
答案 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)