欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

如何使用Elasticsearch groovy script脚本更新数据

发布时间:2025/3/20 编程问答 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 如何使用Elasticsearch groovy script脚本更新数据 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

2019独角兽企业重金招聘Python工程师标准>>>

如何使用Elasticsearch groovy script脚本更新数据 博客分类: 搜索引擎,爬虫

今天细说一下elasticsearch的update更新功能,以及如何利用script脚本更新数据。

 

想要使用script脚本功能,需要在配置文件elasticsearch.yml里设置

 

Python

script.disable_dynamic: false script.disable_dynamic:false

 

关于elasticsearch script的文章,总是会没完没了的修改,为毛?  瞎问 ! 点击原文链接查看更新后的文章:

 

http://xiaorui.cc/?p=2368

 

http://xiaorui.cc/2015/11/20/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8elasticsearch-groovy-script%E8%84%9A%E6%9C%AC%E6%9B%B4%E6%96%B0%E6%95%B0%E6%8D%AE/

 

ES支持更新,但是更新的方式是通过一个提供的脚本进行的。ES的做法是,通过index找到相应的存放记录的节点,然后执行脚本,执行完之 后,返回新的索引。实际上执行的是一个get和reindex的过程,在这个过程中,通过versioning来控制没有其它的更新操作(这个功能是 0.19后可用的)。具体实现的原理应该和elasticsearch Versioning相关。

 

get,reindex的含义是,ES先取出这条记录,然后根据新数据生成新记录,然后在把新记录放回到ES中(并不会覆盖老的记录)。

 

现在没有数据,首先我们需要创建一条记录

 

Python

$ curl -XPUT localhost:9200/xiaorui.cc/blog/1 -d '{"counter" : 1,"tags" : ["red"] }' $curl-XPUTlocalhost:9200/xiaorui.cc/blog/1-d'{"counter" : 1,"tags" : ["red"] }'

 

直接修改数据,一定要注意,直接update的化,会覆盖以前的数据,另外update的时候,需要/index/type/id ,一定要带着id。 elasticsearch 应该不支持搜索query方式update修改数据。 

 

Python

curl -XPUT 'localhost:9200/xiaorui.cc/blog/1?pretty' -d ' {"name": "xiaorui.cc" }' curl-XPUT'localhost:9200/xiaorui.cc/blog/1?pretty'-d' {"name": "xiaorui.cc" }'

 

elasticsearch提供了doc这个局部更新参数,他可以局部修改,而不会直接覆盖以前的数据,这会针对特定的k v,字段修改。 

 

Python

curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update?pretty' -d ' {"doc": { "name": "ruifengyun" } }' curl-XPOST'localhost:9200/xiaorui.cc/blog/1/_update?pretty'-d' {"doc": { "name": "ruifengyun" } }'

 

当Elasticsearch API不能满足要求时,Elasticsearch允许你使用脚本实现自己的逻辑。脚本支持非常多的API,例如搜索、排序、聚合和文档更新。脚本可以通过请求的一部分、检索特殊的.scripts索引或者从磁盘加载方式执行。

 

下面是es script的用法,这些脚本是groovy开发的。 下面的语句的意思是说,将counter的值加4

 

Python

$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{"script" : "ctx._source.counter += count","params" : {"count" : 4} }' $curl-XPOST'localhost:9200/xiaorui.cc/blog/1/_update'-d'{"script" : "ctx._source.counter += count","params" : {"count" : 4} }'

 

通过上面的例子,我们知道tags是个列表,如果用doc局部更新的语法,他是无法做到append的,还是会覆盖tags这个字段。  那么怎么实现列表扩展?  请使用elasticsearch script实现。 

 

Python

$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{"script" : "ctx._source.tags += tag","params" : {"tag" : "white"} }' $curl-XPOST'localhost:9200/xiaorui.cc/blog/1/_update'-d'{"script" : "ctx._source.tags += tag","params" : {"tag" : "white"} }'

 

_update也支持upsert功能,没有这个字段或者key,也会添加这个记录。下面是一个例子,如果没有counter字段,则插入该字段:

 

Python

$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{"script" : "ctx._source.counter += count","params" : {"count" : 4},"upsert" : {"counter" : 1} }' $curl-XPOST'localhost:9200/xiaorui.cc/blog/1/_update'-d'{ "script" : "ctx._source.counter += count", "params" : { "count" : 4 }, "upsert" : { "counter" : 1 } }'

 

下面我们来复杂点的groovy script脚本用法.  当你的source没有china这个key,那么我会增加一个kv

 

Python

curl -XPOST "http://localhost:9200/xiaorui.cc/blog/80/_update" -d' { "script": "if (!ctx._source.containsKey(\"china\")) { ctx._source.attending = newField }","params" : {"newField" : "blue" },"myfield": "data" }' curl-XPOST"http://localhost:9200/xiaorui.cc/blog/80/_update"-d' { "script": "if (!ctx._source.containsKey(\"china\")) { ctx._source.attending = newField }","params" : {"newField" : "blue" },"myfield": "data" }'

 

下面的script语法相对复杂的,会遍历一组字典,然后进行判断赋值。

 

{

“55555″: 22,

“name”: “lisi”,

“distr_pan”: [

{

“k”: 15,

“v”: 15

},

{

“k”: 20,

“v”: 20

}

]

}

 

Python

$ curl -XPUT 'localhost:9200/xiaorui.cc/blog/9123/_update' -d ' {"script" : "def x = false;ctx._source.distr_pan.each({if(it.get('k')==target){x=true}});if(x){ctx._source.distr_pan +=v}","params":{"v":{"k":nlp, "v":35},"target":15} } $curl-XPUT'localhost:9200/xiaorui.cc/blog/9123/_update'-d' { "script" : "def x = false;ctx._source.distr_pan.each({if(it.get('k')==target){x=true}});if(x){ctx._source.distr_pan+=v}", "params":{ "v":{"k":nlp, "v":35},"target":15 } }

elasticsearch script就讲解到这里了,很多例子已经简单明了…   script貌似不是很安全,最少远程代码执行的漏洞暴露过几次了. 下次把python版的script走一遍试试.  貌似对于我们你者来说,不管是groovy python,没什么太大却别,语法看起来都一个模子

 

https://www.elastic.co/guide/en/elasticsearch/reference/1.7/modules-scripting.html#_stored_fields

https://www.elastic.co/guide/en/elasticsearch/reference/1.7/docs-update.html#_literal_doc_as_upsert_literal

转载于:https://my.oschina.net/xiaominmin/blog/1599098

总结

以上是生活随笔为你收集整理的如何使用Elasticsearch groovy script脚本更新数据的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。