即使在使用update\ by\ U查询按顺序更新文档时,elasticsearch也会发生版本冲突

oogrdqng  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(570)

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

POST test/_update_by_query
{
  "script": {
    "source": "ctx._source.address = params.address",
    "params": {
              "address": [{"city":"Mumbai"}]
    }
  },
  "query": {
    "bool": {
      "must": [
        {
                        "term": {
                            "uid": "b123"
                        }
                    }
      ]
    }
  }
}

但我得到以下错误:

version conflict, required seqNo [607], primary term [16]. current document has seqNo [608] and primary term [16]

出现此问题的原因是什么?如何解决此问题?我可以在这里使用任何其他查询而不是按查询更新吗?请帮帮我

u2nhd7ah

u2nhd7ah1#

updatebyquery获取数据的快照,然后更新每个匹配的文档。此错误意味着在您的update by query调用开始运行后,文档已被另一个进程更新。。。
您可以选择忽略这些冲突问题,方法是:

POST test/_update_by_query?conflicts=proceed

在响应中,您将得到有多少文档发生冲突的指示,如果需要,您可以再次运行updatebyquery来提取它们。
更新:
如果您只需要更新一个文档,并且您知道它的id,那么您不需要使用updateby query,只需要使用update端点。最大的优点是update端点有一个名为 retry_on_conflict 它将在发生冲突时重试该操作,以便您可以确保在调用返回时最终更新文档:

POST test/_doc/123/_update?retry_on_conflict=3
{
  "doc": {
    "address": [{"city":"Mumbai"}]
  }
}

相关问题