簡體   English   中英

如何批量更新多個id的彈性搜索?

[英]How to update elastic search in batches for multiple 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM