You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:45:53