ElasticSearch:获取Top Hits聚合路径以在Bucket Script聚合中复用值
解决Top Hits聚合结果作为Bucket Script输入的问题
你遇到的核心问题是:Top Hits聚合返回的是文档数组结构,并非单一数值型指标,所以buckets_path无法通过agg_hit.toto这种路径直接访问字段值。下面提供两种可行的解决思路:
方法一:用Scripted Metric聚合直接提取字段值
把原有的Top Hits替换成scripted_metric聚合,直接提取目标字段toto的数值作为metric输出,让Bucket Script可以通过buckets_path正常访问:
"aggs": { "agg_toto_value": { "scripted_metric": { "init_script": "state.toto = []", "map_script": "state.toto.add(doc['toto'].value)", "combine_script": "return state.toto.length > 0 ? state.toto[0] : null", "reduce_script": "return states[0]" } }, "agg_scr": { "bucket_script": { "buckets_path": { "toto": "agg_toto_value", "other_params": "other_params" }, "script": "params.toto * params.other_params" } } }
这个方法会直接把第一个匹配文档的toto值作为指标输出,完美适配Bucket Script的buckets_path规则。
方法二:在Bucket Script脚本中直接读取Top Hits结果
如果必须保留Top Hits聚合,可以在Bucket Script的脚本里直接遍历Top Hits的返回结构,提取toto值:
"aggs": { "agg_hit": { "top_hits": { "_source": { "includes": ["toto"] }, "size": 1 } }, "agg_scr": { "bucket_script": { "buckets_path": { "other_params": "other_params" }, "script": "def totoVal = _aggregations.agg_hit.hits.hits[0]._source.toto; return totoVal * params.other_params" } } }
这里不需要在buckets_path里映射toto,直接通过_aggregations上下文访问Top Hits的结果数组,取第一个文档的_source.toto值即可。
注意:如果Top Hits可能返回空数组(无匹配文档),记得在脚本中添加空值判断,避免运行报错。
内容的提问来源于stack exchange,提问作者Rona
相关产品推荐
相关产品推荐

