groovy – 使用脚本有条件地更新Elasticsearch中的文档
我有一个用例,其中并发更新请求命中我的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(
+ here和
here).
它的工作方式是Update API允许你两个使用version参数来控制更新是否应该继续. 因此,以上面的示例为例,第一个索引/更新操作将创建一个带有版本的文档:1.然后考虑您有两个并发请求的情况.组件A和B都将发送更新的文档,它们最初都使用版本: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的,则更新将成功. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |