Elasticsearch版本冲突

时间:2018-06-19 09:01:09

标签: elasticsearch

我在弹性搜索中更新了文档。更新后使用我通过使用他们的ID获取相同的文档。它给了我以下回复:

 {
"_index": "b123456",
"_type": "documents",
"_id": "bltde56dd11ba998bab",
"_version": 3,
"found": true,
"_source": {
    "title": "index.json",
    "url": "/index1",
    "tags": [],
    "created_at": "2018-06-19T05:02:38.174Z",
    "updated_at": "2018-06-19T05:07:57.155Z",
    "version": 1,
    "fields": [{
            "uid": "fname",
            "value": "john"
        },
        {
            "uid": "lname",
            "value": "test"
        }
    ],
    "class": "first"
}


}

在我使用update_by_query更新文档后,我发送以下请求到update_by_query:

{
    "script": {
        "source": "ctx._source.title = params.title;ctx._source.url = params.url;ctx._source.created_at = params.created_at;ctx._source.updated_at = params.updated_at;ctx._source.version = params.version;ctx._source.fields = params.fields",
        "params": {
            "title": "Demo title",
            "url": "/demo",
            "created_at": "2018-06-19T05:02:38.174Z",
            "updated_at": "2018-06-19T05:07:57.155Z",
            "version": 2,
            "fields": [{
                    "uid": "fname",
                    "value": "vicky"
                },
                {
                    "uid": "lname",
                    "value": "test"
                }
            ]
        }
    },
    "query": {
        "bool": {
            "must": [{
                    "term": {
                        "_id": "bltde56dd11ba998bab"
                    }
                },
                {
                    "range": {
                        "version": {
                            "lt": 2
                        }
                    }
                }
            ]
        }
    }
}

但它给了我状态代码:409并跟随错误:

  

[文件] [bltde56dd11ba998bab]:版本冲突,当前版本   [3]与提供的[2]

不同

我的文档还包含自定义版本密钥。 任何人都可以帮助我进入这个

1 个答案:

答案 0 :(得分:0)

为了后代,我将回答这个老问题。之所以出现此问题,是因为_version字段中ElasticSearch的内部版本值在您的初始响应中实际上是3,而不是1。

然后,您尝试将文档更新为使用外部版本值2,Elastic将其视为冲突,因为在内部,它认为版本3是最新版本,而不是版本1。您的外部版本方案与Elastic的内部版本方案不同步。

还请注意,您的update调用中应包含以下参数,以指示该操作应遵循外部版本控制的规则,而不是Elastic的内部版本控制方案。

"version_type":external

需要通过指定此参数来进行细微但重要的区分。

  

在version_type设置为external的情况下,Elasticsearch将存储   版本号如给定,不会增加。另外,代替   在检查完全匹配时,Elasticsearch将仅返回一个版本   当前存储的版本大于或等于时发生冲突错误   索引命令中的一个。

有关Elastic版本的更多信息,请参见其blog post