curl命令中Painless脚本引用嵌套字段出现编译错误的求助
curl命令中Painless脚本引用嵌套字段出现编译错误的求助
嗨,我来帮你解决这个问题!
你遇到的编译错误原因其实很明确:Painless脚本里的remove方法需要传入字符串类型的字段名参数,但你在curl请求的脚本里写的original没有加引号,Painless会把它当成一个未定义的变量来解析,自然就抛出了“cannot resolve symbol [original]”的错误。
对比你在Kibana控制台里的写法ctx._source.event.remove('original'),这里的'original'是明确的字符串字面量,所以能正常工作;但到了curl的JSON请求体里,你把单引号去掉了,这就触发了变量解析的问题。
给你几个可行的解决方案:
方案1:修正脚本里的引号(直接在JSON字符串里保留单引号)
在bash环境下,如果你用单引号包裹整个JSON内容,里面的单引号需要用'\''来转义,修正后的curl命令如下:
curl -XPOST "https://<server>:9200/<index>/_update_by_query?conflicts=proceed" -u <creds> --cacert <certpath> -H "Content-Type: application/json" -d ' { "script" : "ctx._source.event.remove('\''original'\'')", "query" : { "exists": { "field": "event.original" } } }'
方案2:用转义的双引号作为字符串参数
也可以在脚本里使用双引号包裹字段名,同时在JSON中对双引号进行转义(用\"),命令如下:
curl -XPOST "https://<server>:9200/<index>/_update_by_query?conflicts=proceed" -u <creds> --cacert <certpath> -H "Content-Type: application/json" -d '{ "script" : "ctx._source.event.remove(\"original\")", "query" : { "exists": { "field": "event.original" } } }'
方案3:使用参数化脚本(推荐)
这种写法更符合Elasticsearch脚本的最佳实践,既避免了引号转义的麻烦,后续修改字段名也更灵活:
curl -XPOST "https://<server>:9200/<index>/_update_by_query?conflicts=proceed" -u <creds> --cacert <certpath> -H "Content-Type: application/json" -d ' { "script": { "source": "ctx._source.event.remove(params.field)", "params": { "field": "original" } }, "query" : { "exists": { "field": "event.original" } } }'
以上三种方案都能让Painless脚本正确识别你要删除的字段名,解决编译错误的问题。
备注:内容来源于stack exchange,提问作者Timothy H
相关产品推荐
相关产品推荐

