![](/img/trans.png)
[英]How to update elastic search in spring boot without changing the elastic server
[英]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.