Elasticsearch能否通过原生更新查询关联更新Type B文档的name字段?
能否用Elasticsearch原生查询实现跨文档字段更新?
可以通过Elasticsearch原生的_update_by_query API结合Painless脚本实现需求,核心思路是利用脚本关联Type A文档,提取name字段更新到对应Type B文档中。
具体实现示例
假设Type A文档存储在索引index_a,Type B文档存储在索引index_b,二者通过id字段关联,执行以下更新请求即可批量完成Type B文档的字段补充:
POST /index_b/_update_by_query { "script": { "source": """ // 根据当前Type B文档的id,获取对应Type A文档 def doc_a = ctx._get.index('index_a').id(ctx._id).get(); // 若存在对应Type A文档,则将name字段赋值给Type B if (doc_a != null) { ctx._source.name = doc_a._source.name; } """, "lang": "painless" } }
注意事项
- 确保执行请求的账号拥有
index_a的读权限和index_b的写权限; - 若Type B文档存在但无对应Type A文档,脚本会自动跳过该文档,避免抛出异常;
- 针对大规模文档更新,可添加
"scroll_size": 1000(或其他合适数值)参数控制每批次处理的文档数量,避免集群性能压力。
内容的提问来源于stack exchange,提问作者Uday Kiran Bandaru
相关产品推荐
相关产品推荐

