在Elasticsearch文档线程中更新数组是否安全?

时间:2019-01-31 16:36:13

标签: python elasticsearch concurrency

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

在某些情况下,可能从两个线程对索引执行多个更新查询,并且有可能更新同一文档。

例如,给定一个文档,其中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]

还是有种族条件要考虑?

谢谢

1 个答案:

答案 0 :(得分:1)

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中的那个。如果其他人同时更改了文档,则他们的更改将丢失。