提问者:小点点

多个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个答案

匿名用户

我没有测试这个,但你可以检查如果这可以有任何帮助

备选方案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();