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

问题描述

我正在尝试使用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"
                        }
                    }
      ]
    }
  }
}

但是我遇到以下错误:

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

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

解决方法

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

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

POST test/_update_by_query?conflicts=proceed

在答复中,您将指出有多少个文档存在冲突,可以根据需要再次通过查询运行更新以将其提取。

更新

如果您只需要更新一个文档并且知道其ID,则无需使用查询更新,只需使用update endpoint。最大的优点是,更新端点具有一个名为retry_on_conflict的参数,该参数在发生冲突时将重试该操作,从而可以确保在调用返回时最终对文档进行更新:

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...