Groovy   发布时间:2022-04-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了groovy – 使用脚本有条件地更新Elasticsearch中的文档大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个用例,其中并发更新请求命中我的Elasticsearch集群.为了确保在较新的事件已经到达集群之后,陈旧事件(一个与较新请求无关的事件)没有更新文档,我想传递一个带有我的更新请求的脚本来比较一个字段确定传入请求是否相关.请求看起来像这样

curl -XPOST 'localhost:9200/test/type1/1/_@R_874_9531@e' -d '
{
  "script": " IF ctx._source.user_@R_874_9531@e_time > my_new_time THEN do not @R_874_9531@e ELSE proceed with @R_874_9531@e","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参数来控制更新是否应该继续.

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

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

curl -XPOST 'localhost:9200/test/type1/1/_@R_874_9531@e?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中的文档全部内容,希望文章能够帮你解决groovy – 使用脚本有条件地更新Elasticsearch中的文档所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。