python - 更新 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]
或者是否有比赛条件需要考虑?
谢谢,
解决方案
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 中的文档。如果其他人同时更改了文档,他们的更改将会丢失。
推荐阅读
- python - 如何在 python 字典中迭代公式并将结果保存在 pandas dataFrame 中?
- c# - Why does pattern matching not compile with JToken
- webpack - 如何使用 Webpack 删除开发代码?
- java - Java:如何分离子进程或创建分离的进程
- vue.js - Vue.js - 如何在 vue v-for 循环中按值 2 递增索引?
- vba - 查询短文本字段中的文本返回“类型不匹配”
- python - 分批拆分张量流数据集
- javascript - .env 文件访问令牌适用于 API,但在 Next.js 中不适用
- json.net - 运行 SerializeObject 的 StackOverflowException
- html - 我怎样才能让我的引导代码响应?