首页 > 解决方案 > 更新 Elasticsearch 文档线程中的数组是否安全?

问题描述

我有一个文档,其中有一个字符串数组作为它的属性之一。

有时会从两个线程对索引执行多个更新查询,并且可能会更新同一个文档。

例如,给定一个文档,其中 my_array 的值为:

my_array = [1,2,3,4]

这两个线程执行以下更新查询,该查询在具有不同参数的索引上运行无痛脚本。

thread_0 -> my_item=3

thread_1 -> my_item=2

int index_of_my_item = ctx._source.my_array.indexOf(params.my_item);

if (-1 != index_of_my_item) {
    ctx._source.my_array.remove(index_of_item);                    
}   

执行线程安全吗?文档中的属性值为:

my_array = [1,4]

或者是否有比赛条件需要考虑?

谢谢,

标签: pythonelasticsearchconcurrency

解决方案


ES 致力于乐观并发控制,它使用版本号来实现这一点,因此没有线程安全的概念(从 ES 角度来看)。

只需浏览这些链接,它就会让您清楚地了解更新对 ES 的确切含义

https://www.elastic.co/guide/en/elasticsearch/guide/master/version-control.html https://www.elastic.co/guide/en/elasticsearch/guide/master/optimistic-concurrency-control .html

使用索引 API 更新文档时,我们会读取原始文档,进行更改,然后一次性重新索引整个文档。最近的索引请求获胜:最后索引的文档就是存储在 Elasticsearch 中的文档。如果其他人同时更改了文档,他们的更改将会丢失。


推荐阅读