Elasticsearch 2.2 Groovy脚本聚合查询无法读取params参数原因求助
报错原因
该问题是Elasticsearch 2.2版本的Groovy脚本绑定规则与高版本不兼容导致的,核心原因有两点:
- ES 2.2 版本的Groovy脚本上下文中没有绑定顶层
params变量,你在脚本中直接调用params['field1']属于访问不存在的变量,这也是报错No such property: params的直接诱因。 - 你当前使用的
script对象嵌套inline、params的写法是ES 5.x及以后版本的规范,2.2版本不支持该结构的参数传递。
修复方案
无需额外安装插件,调整为2.2版本兼容的写法即可正常运行:
ES 2.x版本中,所有自定义参数会直接作为顶层变量注入脚本上下文,同时params字段需要和script字段平级放置,参考写法如下:
GET /_search { "size" : 0, "query" : { "ids" : { "types" : [ ], "values" : [ "docId1", "docId2" ] } }, "aggs": { "countries": { "terms": { "script": "def syn = field1; doc[syn].value", "params": { "field1": "country", "field2": "test", "field3": "test" } } } } }
如果你的集群小版本不支持直接访问顶层参数,可以替换脚本为def syn = _params['field1']; doc[syn].value,用2.x版本专属的_params前缀访问传入参数。
可选配置
如果调整写法后仍有执行权限报错,可在elasticsearch.yml中添加以下配置,重启集群后生效:
script.groovy.sandbox.enabled: true script.inline: on script.indexed: on
内容的提问来源于stack exchange,提问作者nkhcode
相关产品推荐
相关产品推荐

