如何批量更新多个id的弹性搜索?

问题描述

我有一个需求,我需要在弹性搜索中更新一个字段以获取多个 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,我使用上面的代码运行一个循环。

解决方法

我没有测试过这个,但你可以看看这是否有帮助

选项 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();

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...