完全更新文档而不创建(如果不存在)

zan*_*ona 5 put updates nosql elasticsearch

弹性搜索是否有任何方法可以完全(非部分)更新文档而不创建新文档以防它们尚不存在?

到目前为止,我发现该_update方法在传递docjson请求体内的属性以部分更新文档的同时,我想在这种情况下替换整个文档,而不仅仅是部分更新.

我还发现,index发送PUT请求的方法工作正常,尽管在id尚未编制索引的情况下创建新文档.

op_type参数设置为create强制文档创建而不是更新.我想知道是否有任何方法可以始终执行update而不是create新的执行?

或者是否有另一种方法可以让我实现这样的任务?

dre*_*ewr 0

如果我理解正确的话,您想要索引一个文档,但前提是它已经存在?就像一个op_type选项update

假设您的映射保持一致,您主要可以使用更新 API 来完成此操作。使用_update,如果文档不存在,您将返回一个404. 如果确实存在,ES会合并doc与那里存在的任何文档合并。如果您确保发送的新文档包含映射中的所有字段,那么您实际上是在彻底替换它。

但请注意,您可以在不合并文档的情况下在两个请求中相当有效地完成此操作;第一个通过请求检查文档是否存在HEAD。如果HEAD /idx/type/id成功,则执行PUT. 这本质上是更新 API 内部发生的事情,但有一点额外的开销。但HEAD它确实很便宜,因为它不会移动任何有效负载。它只是返回 HTTP 200/404。