如何使用弹性搜索更新进行原子增量?

Mon*_*key 6 elasticsearch

弹性搜索中的此更新是否会导致原子增量?或者它是非原子的吗?

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
    "script" : "ctx._source.counter += count",
    "params" : {
        "count" : 1
    }
}'
Run Code Online (Sandbox Code Playgroud)

Nik*_*yrh 6

我认为建议的更新脚本原子的,引用的Optimistic Concurrency Control会讨论原子文档的更新(这意味着并行更新请求可能会使文档处于"不一致"的非预期状态).

啊,在阅读了更多关于文档部分更新的文档后,我了解到它实际上并不是原子的,但它会检查版本号并在它们不匹配时失败(因此更新不会默默地丢失,就像非情况一样) - CPU上的原子增量):

为避免丢失数据,更新API在检索步骤中检索文档的当前_version,并在reindex步骤期间将其传递给索引请求.如果另一个进程在retrieve和reindex之间更改了文档,则_version编号将不匹配,更新请求将失败.

然而,有一个简单的解决方法,使其工作与原子增量相同:

对于部分更新的许多用途,文档已被更改无关紧要.例如,如果两个进程都在递增页面视图计数器,那么它发生的顺序无关紧要; 如果发生冲突,我们唯一需要做的就是重新尝试更新.

这可以通过将retry_on_conflict 参数设置为update失败前应重试的次数来自动完成; 它默认为0.


And*_*fan 5

非原子。需要使用version参数告诉ES只有特定版本才更新文档:https : //www.elastic.co/guide/en/elasticsearch/guide/master/optimistic-concurrency-control.html

例如: /test/type1/1/_update?version=5