elasticsearch 按查询更新(cnc/ task)-无故障信息-处理冲突

ktca8awb  于 6个月前  发布在  ElasticSearch
关注(0)|答案(1)|浏览(70)

我正在通过查询作为任务(wait_for_completion=false)运行更新,并使用“conflicts= proceed”。我确实希望有时会发生版本冲突,并且可以在get task response(/task/task-id)中看到该信息。我计划重新处理冲突的记录。
问题:当版本冲突发生时,我没有看到'failures'数组下的冲突记录id让我能够重新处理。非常感谢这方面的任何建议。

"response" : {
    "took" : 69055,
    "timed_out" : false,
    "total" : 286164,
    "updated" : 285885,
    "created" : 0,
    "deleted" : 0,
    "batches" : 287,
    "version_conflicts" : 279,
    "noops" : 0,
    "retries" : {
      "bulk" : 0,
      "search" : 0
    },
    "throttled" : "0s",
    "throttled_millis" : 0,
    "requests_per_second" : -1.0,
    "throttled_until" : "0s",
    "throttled_until_millis" : 0,
    "failures" : [ ]
  }

字符串
注意:另一个观察结果是,如果我们使用'conflicts= abort'运行它,那么我们会在响应中看到预期的失败信息。
下面是正在使用的查询模板的更新,

{
    "conflicts": "proceed",
    "query": {
        "term": {
            "location_id": {
                "value": 121
            }
        }
    },
    "script": {
        "params": {},
        "source": "ctx._source.sys_updated_at = new Date();ctx._source.location_name = 'New York';"
    }
}

ttygqcqt

ttygqcqt1#

您可以做的是修改查询以添加一个检查location_name是否不是New York的约束,因为发生冲突的文档没有更新此字段。
所以在下一次运行时,只有那些冲突的会被更新,你可以重新运行几次,直到你没有冲突。
查询应该是这样的(也许你的字段被称为location_name.keyword):

POST your-index/_update_by_query
{
  "conflicts": "proceed",
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "location_id": {
              "value": 121
            }
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "location_name": "New York"
          }
        }
      ]
    }
  },
  "script": {
    "params": {},
    "source": "ctx._source.sys_updated_at = new Date();ctx._source.location_name = 'New York';"
  }
}

字符串

相关问题