我有一个文档,其中包含一个字符串数组作为其属性之一。
在某些情况下,可能从两个线程对索引执行多个更新查询,并且有可能更新同一文档。
例如,给定一个文档,其中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]
还是有种族条件要考虑?
谢谢
答案 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中的那个。如果其他人同时更改了文档,则他们的更改将丢失。