基于groovy脚本进行partial update
首先添加一条数据到es中1
2
3
4
5PUT test_index/test_type/2
{
"num":0,
"tags":[]
}
内置脚本
1 | POST test_index/test_type/2/_update |
通过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
10POST 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 update1
2
3
4
5
6
7
8
9
10POST 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
8POST /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操作.