使用的ElasticSearch版本是6.4.2
原文:https://www.elastic.co/guide/cn/elasticsearch/guide/current/partial-updates.html
我们甚至可以选择通过设置 ctx.op
为 delete
来删除基于其内容的文档:
POST /website/blog/1/_update
{
"script" : "ctx.op = ctx._source.views == count ? 'delete' : 'none'",
"params" : {
"count": 1
}
}
直接拷贝curl在kibana的DevTools上执行是报错的:
{
"error": {
"root_cause": [
{
"type": "remote_transport_exception",
"reason": "[node-0][127.0.0.1:9300][indices:data/write/update[s]]"
}
],
"type": "illegal_argument_exception",
"reason": "failed to execute script",
"caused_by": {
"type": "script_exception",
"reason": "compile error",
"script_stack": [
"... p = ctx._source.views == count ? 'delete' : 'none'",
" ^---- HERE"
],
"script": "ctx.op = ctx._source.views == count ? 'delete' : 'none'",
"lang": "painless",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "Variable [count] is not defined."
}
}
},
"status": 400
}
原因是语法改变了,需要用新的语法写,新的如下所示:
POST /website/blog/1/_update
{
"script": {
"source" : "ctx.op = ctx._source.views == params.count ? 'delete' : 'none'",
"params" : {
"count": 1
}
}
}
curl格式如下所示:
curl -XPOST "http://localhost:9200/website/blog/1/_update" -H 'Content-Type: application/json' -d'
{
"script": {
"source" : "ctx.op = ctx._source.views == params.count ? \"delete\" : \"none\"",
"params" : {
"count": 1
}
}
}'
此写法参考的是这篇文章的解决方法:https://stackoverflow.com/questions/43079189/elasticsearch-script-variable-not-defined。这篇文章也是之前的示例“通过使用脚本给 tags
数组添加一个新的标签”报错的解决方法。
curl -XPOST localhost:9200/website/blog/1/_update?pretty -d '{
"script" : {
"inline": "ctx._source.tags.add(params.new_tag)",
"params" : {
"new_tag" : "tag2"
}
}
}'
其中将里面的inline改成了source,因为执行完后,DevTools提示inline写法已经被弃用,应使用最新写法source。