Elasticsearch批量Upsert操作需求咨询:存在则更新指定字段,不存在则创建含多字段文档
Elasticsearch批量Upsert操作需求咨询:存在则更新指定字段,不存在则创建含多字段文档
嗨,这个需求其实用Elasticsearch原生参数就能解决,完全不用写脚本,我来给你捋清楚:
你之前的写法问题在于,当文档不存在时,Elasticsearch只会使用upsert里定义的内容创建新文档,不会自动把doc里的字段合并进去。而你需要的是不存在时同时创建A和B,存在时只更新B且不碰其他字段,这时候doc_as_upsert参数就是关键!
你只需要调整一下你的bulk请求,加上这个参数就行:
{"update": {"_id": my_id, "_index": index_name, "retry_on_conflict": 30}} {"doc": {"B": some_val}, "upsert": {"A": another_value}, "doc_as_upsert": true}
咱们来拆解一下这个写法的效果:
- 当文档已经存在时:只会用
doc里的B字段覆盖原文档的B值,其他所有字段(包括A以及你提到的其他额外字段)都会原封不动保留,完全符合你的要求。 - 当文档不存在时:Elasticsearch会自动把
doc和upsert里的内容合并,创建出同时包含A和B的新文档,后续如果文档新增其他字段,也不会受这个操作影响。
这个参数是Elasticsearch原生支持的,和普通update操作性能一致,完全不用顾虑脚本带来的性能问题或者报错风险,刚好匹配你的需求~
备注:内容来源于stack exchange,提问作者Arik
相关产品推荐
相关产品推荐

