Elasticsearch-11-基于groovy脚本进行partial update

基于groovy脚本进行partial update

首先添加一条数据到es中

1
2
3
4
5
PUT test_index/test_type/2
{
"num":0,
"tags":[]
}

内置脚本

1
2
3
4
POST test_index/test_type/2/_update
{
"script": "ctx._source.num+=1"
}

通过ctx._source.filed 去操作filed的值

执行完毕后去查询一下

1
GET test_index/test_type/2

返回值:

1
2
3
4
5
6
7
8
9
10
11
{
"_index": "test_index",
"_type": "test_type",
"_id": "2",
"_version": 2,
"found": true,
"_source": {
"num": 1,
"tags": []
}
}

可以看到num已经变成了1

外部脚本

用外部脚本进行partial update

首先要在es的config/scripts目录下新建groovy脚本,比如我们要在tags下加一个值,新建脚本test-add-tags.groovy,文件内容是

1
ctx._source.tags+=new_tag

然后用外部脚本进行更新

1
2
3
4
5
6
7
8
9
10
POST test_index/test_type/2/_update
{
"script": {
"lang": "groovy", // 指定脚本语言
"file": "test-add-tags", // 文件名称(不包含文件后缀名)
"params": { // 参数的集合
"new_tag":"tag1" // 参数名和值
}
}
}

用外部脚本删除document

同样需要在config/scripts目录下新建groovy脚本, 脚本名称:test-delete-document,脚本内容是:

1
ctx.op=ctx._source.num == count ? 'delete' : 'none'

就是num的值跟count相等的时候才删除,如果不相等,什么都不做.
然后执行partial update

1
2
3
4
5
6
7
8
9
10
POST test_index/test_type/2/_update
{
"script": {
"lang": "groovy",
"file": "test-delete-document",
"params": {
"count":1
}
}
}

传入的参数count是1,这个时候document中的num的值也是1,所以这document会被删除掉

upsert操作

此时这个id是2的document已经被删除,如果这个时候直接去进行partial update,会报错,因为这个document不存在
这时候可以使用upsert去进行初始化操作
执行:

1
2
3
4
5
6
7
8
POST /test_index/test_type/2/_update
{
"script": "ctx._source.num+=1",
"upsert": {
"num":0,
"tags":[]
}
}

执行完成后,查询发现num是0 tags是[],并没有去执行script中的脚本.
再次运行上面的代码, 查询后发现num已经更新为1

upsert操作:如果指定的document不存在,就执行upsert中的初始化操作,如果指定的document存在,就执行doc或者script中指定的partial update操作.