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

时间:2015-03-15 05:31:28

标签: elasticsearch

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

{ "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程序中进行bullk更新:

Client client = getClient(); //TransportClient

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

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

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

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

有人可以开导我吗?我有一种直觉,认为我可能做错事。

谢谢和问候。

2 个答案:

答案 0 :(得分:3)

以下代码应该可以正常使用。 对于每个文档更新,您需要创建一个单独的更新请求,如下所示,并继续将其添加到批量请求。 批量请求准备好后,执行get on it。

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 :(得分:0)

我遇到了同样的问题,我的程序中只有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);
}