4: ES内执行Groovy脚本,做文档部分更新、执行判断改变操作类型
ES有内置的Groovy脚本执行内核,可以在命令的Json内嵌入Groovy脚本语句
-
前提数据:
-
让 num 加 10.
POST /test_index/test_type/1/_update
{
"script":"ctx._source.num+=10"
}
-
把Groovy脚本(含参数)保存在文件中,在sense中给参数赋值,并执行
保存目录: es根目录 / config / scripts, 创建 set_num.groovy
内容为:把num字段设置为参数传入的值,其中 param_num是脚本的参数,需要在命令中传入:
在sense中,执行:
POST /test_index/test_type/1/_update
{
"script":{
"lang":"groovy",
"file":"set_num",
"params":{
"param_num":181
}
}
}
-
用脚本做些其他事情:改变执行的命令
脚本内容:当传入参数为true时,就执行delete操作;为false时,不做任何操作
ctx.op = param_isdelete == true ? "delete" : "none"
在sense中执行:
POST /test_index/test_type/1/_update
{
"script":{
"lang":"groovy",
"file":"change_op_type",
"params":{
"param_isdelete":true
}
}
}
-
ES内置的upsert命令,确保脚本安全的执行(当要更新的文档不存在时)。
适用场景:假设我们需要 在 Elasticsearch 中存储一个页面访问量计数器。 每当有用户浏览网页,我们对该页面的计数器进行累加。但是,如果它是一个新网页,我们不能确定计数器已经存在。 如果我们尝试更新一个不存在的文档,那么更新操作将会失败。
如下:如果指定的文档不存在,那么当执行脚本的时候,会报错
可以使用 upsert命令。
当文档不存在,则执行upsert,对文档进行初始化,注意,初始化后不再执行script
当文档存在,则执行script