Elasticsearch 2.4中如何获取动态Object内指定键的值?
在Elasticsearch 2.4的Groovy脚本中获取动态Object字段的值
嘿,针对你这个场景,其实有两种实用的方式能在Groovy脚本里拿到misc对象内动态键对应的值,我给你具体说明下:
方式1:通过_source直接访问(推荐)
这种方式直接从原始文档的_source数据里取值,不需要考虑动态字段是否被索引,非常稳妥。Groovy支持两种写法,你可以任选:
- 点+括号组合:
_source.misc[dynamic_key] - 全括号写法:
_source['misc'][dynamic_key]
举个实际的查询例子,假设你要取201805这个键的值,脚本字段的写法如下:
{ "query": { "match_all": {} }, "script_fields": { "target_month_value": { "script": { "inline": "def targetKey = '201805'; _source.misc[targetKey]" } } } }
执行这个查询后,就能在返回结果的fields里拿到target_month_value对应的值10了。
方式2:通过doc对象访问(适合索引字段场景)
因为你的misc设置了dynamic: true,所以每个动态生成的键(比如201804)会自动被映射为misc.201804这样的索引字段。你可以通过字符串拼接的方式构建字段名,再从doc对象里取值:
{ "query": { "match_all": {} }, "script_fields": { "target_month_value": { "script": { "inline": "def targetKey = '201806'; doc['misc.' + targetKey].value" } } } }
这种方式适合需要基于索引字段做排序、评分计算的场景,但要注意:如果某个动态键对应的字段没有被索引(比如手动设置了index: no),那doc对象里就取不到这个值,此时还是得用_source的方式。
注意事项
Elasticsearch 2.4默认可能限制了inline脚本的执行,如果你运行脚本时遇到权限错误,需要修改elasticsearch.yml配置文件,开启相关权限:
script.inline: on script.indexed: on
不过要注意,生产环境开启inline脚本存在安全风险,建议根据实际情况做权限控制。
内容的提问来源于stack exchange,提问作者JVK
相关产品推荐
相关产品推荐

