在弹性搜索中是否有任何方法可以完全(而不是部分)更新文档,而不创建新文档,以防文档不存在?
到目前为止,我发现_update
方法在json请求体中传递doc
属性以部分更新文档,但是,在这种情况下,我希望替换整个文档,而不仅仅是部分文档。
我还发现,index
方法(其中发送PUT
请求)运行良好,尽管在id
尚未索引的情况下创建了一个新文档。
将op_type
参数设置为create
将强制文档创建而不是更新。我想知道是否有任何方法可以始终强制执行update
,而从不使用新的create
?
或者,也许还有其他方法可以让我完成这样的任务?
如果我理解正确,你想索引一个文档,但前提是它已经存在?像update
的op_type
选项?
考虑到映射保持一致,您基本上可以使用更新API来完成此操作。使用_update
,如果文档不存在,您将得到一个404
。如果它确实存在,ES将把doc
的内容与那里存在的任何文档合并。如果你确保你发送了一个包含映射中所有字段的新文档,那么你实际上是在彻底替换它。
但是,请注意,您可以在不需要文档合并的情况下在两个请求中高效地执行此操作;第一个是用CCD_ 15请求来检查文档是否存在。如果HEAD /idx/type/id
成功,则执行PUT
。这基本上就是API更新的内部情况,只需要一点额外的开销。但HEAD
确实很便宜,因为它不会打乱任何有效载荷。它只是返回一个HTTP200/404。