今天细说一下elasticsearch的update更新功能,以及如何利用script脚本更新数据。
想要使用script脚本功能,需要在配置文件elasticsearch.yml里设置
Python
script.disable_dynamic: false
script.disable_dynamic:false
关于elasticsearch script的文章,总是会没完没了的修改,为毛? 瞎问 ! 点击原文链接查看更新后的文章:
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
相关推荐
Elasticsearch Painless Script入门教程--示例数据。 自Elasticsearch 5.x 引入Painless,使得Elasticsearch拥有了安全、可靠、高性能脚本的解决方案。Painless是Elastic开发并做了专门的优化,相较之前的脚本更...
"sort-script:elasticsearch排序脚本"这个主题聚焦于如何通过自定义脚本来扩展Elasticsearch的排序功能。SortScript是一个原生插件,它的引入使得我们可以基于特定的业务逻辑或复杂的数据计算来实现个性化的排名算法...
在 Elasticsearch 中,可以使用脚本字段(Script Fields)来为每个文档动态生成一个字段值。这在预处理数据时非常有用,可以作为后续聚合和过滤的基础。 2. **管道聚合**(Pipeline Aggregations): 管道聚合是...
项目中es版本从es2升级到es6之后,使用的groovy废弃,转换为painless脚本,转换过程中经过查询官网总结整理而成的笔记
该漏洞的_root_cause 在于 ElasticSearch 沙盒代码黑名单中的 Java 危险方法不全,从而导致恶意用户仍可以使用反射的方法来执行 Java 代码。Groovy 是一种开发语言,可以在不使用 Java 的前提下实现代码执行。如果...
- **Elasticsearch**:搜索引擎Elasticsearch也支持使用Groovy执行脚本,用于索引、查询和数据处理。 总的来说,Groovy作为一个在JVM上运行的语言,提供了许多简化编程的特性,如简洁的语法、动态类型和强大的闭包...
"radar-master"这个文件名可能表示该项目的主分支或源代码仓库,包含了项目的核心组件和配置,可能包括Spring Boot的启动类、MongoDB的数据访问对象(DAO)、Groovy的规则脚本以及与Elasticsearch交互的部分。...
Elasticsearch 是一款功能强大的开源搜索引擎,用于存储、搜索和分析海量数据。它基于 Lucene 库构建,提供了分布式、实时、可扩展的搜索和分析能力。本篇笔记将深入探讨Elasticsearch中的核心概念以及基本操作。 ...
6. **脚本引擎(Scripting Engines)**:Elasticsearch支持多种脚本语言,如Painless、Groovy等,这些在`src/main/java/org/elasticsearch/script/`下可以看到具体的实现。 7. **分布式特性(Distributed Features...
为了使用Elasticsearch Java API,首先需要将其添加到项目的依赖管理文件中。通常,这是通过在Maven项目中的`pom.xml`文件里添加依赖来实现的。例如: ```xml <groupId>org.elasticsearch.client <artifactId>...
Elasticsearch 1.7 Redis的3.4 PostgreSQL 为所需的Rails环境设置Trigram扩展 sudo apt-get install postgresql-contrib -y sudo service postgresql restart cd /usr/share/postgresql/9.1/extension/ RAILS_ENV=...
这与Groovy、Python和VBScript等其他脚本语言有相似之处。JavaScript的主要用途包括前端页面交互、后端编程(通过Node.js实现)以及嵌入式系统(如Ruff)的应用。 当前,JavaScript的标准版本主要包括EcmaScript 5...
script模块:支持6种脚本语言(Groovy/JS/Lua/MVEL/Python/Ruby) 2020.05.01 common模块selection包:支持4种查询表达式(CSS/JSONPath/RegExp/XPath)支持5种查询内容(JSON/HTML/Swing/Text/XML) 2020.05.08 transaction...