如何使Elasticsearch分类聚合子桶遵循top_hits排序规则?
Elasticsearch子桶按内部top_hits规则排序实现方案
需求说明
需要让topClassificationGroup下的子桶遵循其内部top_hits的排序规则进行排序,即包含最优top_hit结果的子桶排在classification聚合的首位。
原聚合配置
"aggs": { "classification": { "categorize_text": { "field": "classification" }, "aggs": { "max_score_inner": { "max": { "script": { "lang": "expression", "source": "_score" } } }, "topClassificationGroup": { "categorize_text": { "field": "subClassification", "size": 3 }, "aggs": { "topSubClassificationGroup": { "top_hits": { "size": 3, "track_scores": true, "sort": [ { "orderCount2": "desc" }, { "bestOverall.raw": "desc" }, { "bestOverallC.raw": "desc" }, { "orderCount": "desc" }, "_score" ] } } } } } } }
修改后的配置(实现子桶排序)
要实现该需求,需在topClassificationGroup的聚合中添加bucket_sort管道聚合,基于topSubClassificationGroup中第一条top_hit的排序字段值来排序子桶:
"aggs": { "classification": { "categorize_text": { "field": "classification" }, "aggs": { "max_score_inner": { "max": { "script": { "lang": "expression", "source": "_score" } } }, "topClassificationGroup": { "categorize_text": { "field": "subClassification", "size": 3 }, "aggs": { "topSubClassificationGroup": { "top_hits": { "size": 3, "track_scores": true, "sort": [ { "orderCount2": "desc" }, { "bestOverall.raw": "desc" }, { "bestOverallC.raw": "desc" }, { "orderCount": "desc" }, "_score" ] } }, "sort_sub_buckets": { "bucket_sort": { "sort": [ { "topSubClassificationGroup.hits.hits.0.orderCount2": { "order": "desc" } }, { "topSubClassificationGroup.hits.hits.0.bestOverall.raw": { "order": "desc" } }, { "topSubClassificationGroup.hits.hits.0.bestOverallC.raw": { "order": "desc" } }, { "topSubClassificationGroup.hits.hits.0.orderCount": { "order": "desc" } }, { "topSubClassificationGroup.hits.hits.0._score": { "order": "desc" } } ] } } } } } } }
关键说明
bucket_sort是管道聚合,用于对topClassificationGroup生成的子桶进行排序- 通过
topSubClassificationGroup.hits.hits.0.xxx引用每个子桶内top_hits返回的第一条文档(即最优结果)的对应字段,完全复用原top_hits的排序逻辑 - 保留
size:3配置,确保仅返回排序后的前3个子桶
内容的提问来源于stack exchange,提问作者Stephan Zehnder
相关产品推荐
相关产品推荐

