gpt4 book ai didi

groovy - 使用脚本有条件地更新 Elasticsearch 中的文档

转载 作者:行者123 更新时间:2023-11-29 02:46:33 25 4
gpt4 key购买 nike

我有一个用例,其中并发更新请求命中了我的 Elasticsearch 集群。为了确保陈旧事件(与较新请求无关的事件)在较新事件已经到达集群后不会更新文档,我想通过我的更新请求传递一个脚本来比较一个字段以确定传入请求是否相关。请求看起来像这样:

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '
{
"script": " IF ctx._source.user_update_time > my_new_time THEN do not update ELSE proceed with update",
"params": {
"my_new_time": "2014-09-01T17:36:17.517""
},
"doc": {
"name": "new_name"
},
"doc_as_upsert": true
}'

我在“脚本”字段中编写的伪代码是否可以在 Elasticsearch 中使用?如果是这样,我希望在语法(groovy、python 或 javascript)方面得到一些帮助。

任何替代方法建议也将不胜感激。

最佳答案

Elasticsearch 内置了 optimistic concurrency control (+ herehere)。

它的工作方式是 Update API允许你们两个使用 version 参数来控制更新是否应该继续。

以您上面的示例为例,第一个索引/更新操作将创建一个具有version: 1 的文档。然后以您有两个并发请求的情况为例。组件 A 和 B 都将发送更新后的文档,它们最初都检索到带有 version: 1 的文档,并将在其请求中指定该版本(参见 version=1下面的查询字符串)。 Elasticsearch 将更新文档当且仅当提供的版本与当前版本相同

组件A和B都发送了这个,但是A的请求是第一个发送的:

curl -XPOST 'localhost:9200/test/type1/1/_update?version=1' -d '{
"doc": {
"name": "new_name"
},
"doc_as_upsert": true
}'

此时文档的版本将为 2,B 的请求将以 HTTP 409 Conflict 结束,因为 B 假定文档仍为版本 1,即使版本在同时应 A 的要求。

B 绝对可以使用新版本(即 2)检索文档并再次尝试更新,但这次在 URL 中使用 ?version=2。如果第一个到达ES,则更新成功。

关于groovy - 使用脚本有条件地更新 Elasticsearch 中的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31599068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com