Elasticsearch:批量更新保存在 Java 字符串中的多个文档?

Elasticsearch: bulk update multiple documents saved in a Java String?

我可以创建以下字符串,保存在一个名为 updates 的 Java 字符串对象中。

{ "update":{ "_index":"myindex", "_type":"order", "_id":"1"} }
{ "doc":{"field1" : "aaa", "field2" : "value2" }}
{ "update":{ "_index":"myindex", "_type":"order", "_id":"2"} }
{ "doc":{"field1" : "bbb", "field2" : "value2" }}
{ "update":{ "_index":"myindex", "_type":"order", "_id":"3"} }
{ "doc":{"field1" : "ccc", "field2" : "value2" }}

现在我想在 Java 程序中进行批量更新:

Client client = getClient(); //TransportClient

BulkRequestBuilder bulkRequest = client.prepareBulk();
//?? how to attach updates variable to bulkRequest?

BulkResponse bulkResponse = bulkRequest.execute().actionGet();

我找不到在执行前将上述更新变量附加到 bulkRequest 的方法。

我注意到我可以将 UpdateRequest 对象添加到 bulkRequest,但它似乎一次只能添加一个文档。如上所述,我在一个字符串中有多个待更新文档。

有人可以启发我吗?我有一种直觉,我可能会以错误的方式做事。

感谢和问候。

以下代码应该适合您。 对于每个文档更新,您需要创建一个单独的更新请求,如下所示,并继续将其添加到批量请求中。 批量请求准备就绪后,对其执行获取。

JSONObject obj = new JSONObject();
obj.put("field1" , "value1");
obj.put("field2" , "value2");
UpdateRequest updateRequest = new UpdateRequest(index, indexType, id1).doc(obj.toString());
BulkRequestBuilder bulkRequest = client.prepareBulk();
bulkRequest.add(updateRequest);


obj = new JSONObject();
obj.put("fieldX" , "value1");
obj.put("fieldY" , "value2");
updateRequest = new UpdateRequest(index, indexType, id2).doc(obj.toString());
bulkRequest = client.prepareBulk();
bulkRequest.add(updateRequest);


bulkRequest.execute().actionGet();

我 运行 遇到了同样的问题,我的程序中只有 1 个文档得到更新。然后我发现以下方法非常有效。这使用 spring java 客户端。我还列出了我在代码中使用的依赖项。

import org.elasticsearch.action.update.UpdateRequest;

import org.elasticsearch.index.query.QueryBuilder;

import org.springframework.data.elasticsearch.core.query.UpdateQuery;

import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder;

private UpdateQuery updateExistingDocument(String Id) {
    // Add updatedDateTime, CreatedDateTime, CreateBy, UpdatedBy field in existing documents in Elastic Search Engine
    UpdateRequest updateRequest = new UpdateRequest().doc("UpdatedDateTime", new Date(), "CreatedDateTime", new Date(), "CreatedBy", "admin", "UpdatedBy", "admin");

    // Create updateQuery
    UpdateQuery updateQuery = new UpdateQueryBuilder().withId(Id).withClass(ElasticSearchDocument.class).build();
    updateQuery.setUpdateRequest(updateRequest);

    // Execute update
     elasticsearchTemplate.update(updateQuery);
}