如何批量更新多id的ElasticSearch?

juud5qan  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(356)

我需要在ElasticSearch中更新一个字段以查找多个ID。目前,我正在使用xcontentbuilder并传递一个id和字段名,但这是一个for循环,这就是为什么如果传递多个id,时间复杂性会变得很糟糕。是否有一种方法可以批量执行相同的操作?
我的代码如下:

UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index("index");
updateRequest.type("_doc");
updateRequest.id("1");
updateRequest.doc(jsonBuilder()
        .startObject()
            .field("gender", "male")
        .endObject());
client.update(updateRequest).get();

id是一个动态字段,对于每个id,我使用上面的代码运行一个循环。

arknldoa

arknldoa1#

我还没有测试过这个,但是你可以检查一下这个是否有帮助
备选案文1:

List<String> ids = new ArrayList<>();
    ids.add("1");
    ids.add("2");
    for (String id : ids) {
        UpdateRequest updateRequest = new UpdateRequest();
        updateRequest.index("index");
        updateRequest.type("_doc");
        updateRequest.id("1");
        updateRequest.doc(jsonBuilder().startObject().field("gender", "male").endObject());
        bulkRequest.add(updateRequest);
    }
    BulkResponse bulkResponse = bulkRequest.execute().actionGet();

选项2:使用脚本

List<String> ids = new ArrayList<>();
    ids.add("1");
    ids.add("2");
    Map<String, Object> params = new HashMap<>();
    String scriptCode = "ctx._source.gender=params.gender";
    params.put("gender", "male");
    BulkRequestBuilder bulkRequest = client.prepareBulk();
    for(String id : ids) {
        UpdateRequestBuilder updateRequestBuilder = client.prepareUpdate("index", "type", id)
                .setScript(new Script(ScriptType.INLINE, "painless", scriptCode, params));
        bulkRequest.add(updateRequestBuilder);
    }
    BulkResponse bulkResponse = bulkRequest.execute().actionGet();

相关问题