如何通过Python API在OpenSearch中实现文档Upsert(非覆盖更新)
OpenSearch 实现非覆盖式Upsert操作的正确方法
你用index API搭配doc_as_upsert=True的方式是错误的——这个参数属于update API,index API本身没有这个参数,而且它的逻辑是只要指定ID存在就直接覆盖整个文档,所以根本实现不了你要的非覆盖更新效果。
要实现「ID不存在则插入,存在则只更新指定字段、保留原有字段」的Upsert,必须用update API,正确代码如下:
pyClient.update( index=indexName, id=document['id'], body={ "doc": document, "doc_as_upsert": True }, refresh=True )
逻辑说明
- 当目标ID不存在时:
doc_as_upsert=True会自动把doc中的内容作为新文档插入到索引中。 - 当目标ID已存在时:只会更新
doc里的字段,原有未被提及的字段会完整保留。比如你原有文档是{"id":1,"name":"Jack"},传入{"id":1,"job":"engineer"}执行后,最终文档会变成{"id":1,"name":"Jack","job":"engineer"},完全符合你的需求。
另外补充一点:文档中的id字段其实可以不用放到doc里,因为已经通过id参数指定了文档ID,OpenSearch不会把外部指定的ID存到文档的_source中(除非你特意配置映射让它存储),不过即使放进去也不会影响效果。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

