即使使用 update_by_query 顺序更新文档时,Elastic Search 也会出现版本冲突

Sur*_*lvi 7 elasticsearch kibana elastic-stack elasticsearch-5

我正在尝试使用 update_by_query 更新文档的嵌套类型字段。我正在使用以下脚本查询:

POST test/_update_by_query
{
  "script": {
    "source": "ctx._source.address = params.address",
    "params": {
              "address": [{"city":"Mumbai"}]
    }
  },
  "query": {
    "bool": {
      "must": [
        {
                        "term": {
                            "uid": "b123"
                        }
                    }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

version conflict, required seqNo [607], primary term [16]. current document has seqNo [608] and primary term [16]
Run Code Online (Sandbox Code Playgroud)

此问题的原因是什么以及如何解决此问题?我可以在这里使用任何其他查询来代替 _update_by_query 吗?请在这里帮助我

Val*_*Val 8

按查询更新会获取数据快照,然后更新每个匹配的文档。此错误意味着在您通过查询调用更新开始运行后,该文档已被另一个进程更新...

您可以选择忽略这些冲突问题,方法如下:

POST test/_update_by_query?conflicts=proceed
Run Code Online (Sandbox Code Playgroud)

在响应中,您将指示有多少文档存在冲突,并且您可以根据需要再次通过查询运行更新以选取它们。

更新:

如果您只需要更新单个文档并且您知道其 ID,那么您不需要使用 update by query,而只需使用update endpoint。最大的优点是更新端点有一个名为的参数,retry_on_conflict该参数将在发生冲突时重试操作,这样您就可以确保在调用返回时文档最终被更新:

POST test/_doc/123/_update?retry_on_conflict=3
{
  "doc": {
    "address": [{"city":"Mumbai"}]
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

refresh=True您可以在查询的参数中使用。

  • 令人惊讶的是它有效,但谁能告诉我其背后的原因,我无法推断 (3认同)