ElasticSearch 5.2聚合:过滤与分桶排序问题咨询
Elasticsearch 5.2 聚合查询解决方案:过滤+分桶排序结合
我之前处理过类似的聚合场景,给你一个完全适配需求的Elasticsearch 5.2查询语句,能一次性搞定30岁以上人群按国家分组的平均薪资,并返回薪资最高的前10个国家:
{ "query": { "bool": { "filter": [ { "range": { "age": { "gt": 30 } } } ] } }, "size": 0, "aggs": { "group_by_country": { "terms": { "field": "country", "size": 10, "order": { "avg_salary": "desc" } }, "aggs": { "avg_salary": { "avg": { "field": "salary" } } } } } }
关键部分拆解:
- 过滤逻辑:用
bool.filter来筛选age>30的数据,这种方式不会影响文档评分,性能更好,而且能确保后续聚合只基于过滤后的数据集。 - 分桶聚合:通过
terms聚合按country字段分组,size:10直接限制返回前10个结果。 - 指标聚合:在每个国家桶内嵌套
avg聚合计算该国家的平均薪资,命名为avg_salary。 - 排序规则:在
terms聚合里通过order指定按avg_salary降序排列,这样就能直接得到薪资最高的前10个国家。
你之前单独用过滤器没成功,大概率是没把过滤逻辑放在查询层,或者没在分桶聚合里指定基于指标的排序规则。这个查询把所有环节整合到一起,完全满足你的需求~
内容的提问来源于stack exchange,提问作者TomVA
相关产品推荐
相关产品推荐

