我有一个文档,其中包含一个字符串数组作为其属性之一。
在某些情况下,会从两个线程对索引执行多个更新查询,并且有可能更新同一文档。
例如,给定一个文档,其中my_array的值为:
my_array = [1,2,3,4]
这两个线程执行以下更新查询,该查询在具有不同参数的索引上运行无痛脚本。
线程_0-> my_item = 3
线程_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]
还是有种族条件要考虑?
谢谢,
最佳答案
ES在乐观并发控制上工作,并且它使用版本号来实现这一点,因此没有线程安全的概念(从ES Angular 来看)。
只需浏览这些链接,它将使您很清楚,对于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中的文件。如果其他人同时更改了文档,则他们的更改将丢失。
关于python - 在Elasticsearch文档线程中更新数组是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54465210/