写点什么

Elasticsearch 聚合的嵌套桶如何排序 (1),java 大学基础教程

作者:Java高工P7
  • 2021 年 11 月 09 日
  • 本文字数:1637 字

    阅读完需:约 5 分钟

"make_agg": {


"terms": { ---外层桶,按照汽车品牌聚合


"field": "make" ---字段是 make


},


"aggs": {


"color_agg": {


"terms": { ---内层桶,按照汽车颜色聚合


"field": "color", ---字段是 color


"order": { ---要求内层桶排序


"make_color_sales_rank": "desc" ---排序字段是 make_color_sales_rank,降序


}


},


"aggs": {


"make_color_sales_rank": { ---聚合字段是 make_color_sales_rank


"sum": { ---metrics 处理,类型是累加和


"field": "price" ---累加值取自 price 字段的值


}


}


}


}


}


}


}


}


响应数据如下,可见 buckets 内的每个对象自身也有 buckets 数组,里面的每个元素就是子桶,这些子桶是已经排序过了的:


......


"aggregations" : {


"make_agg" : {


"doc_count_error_upper_bound" : 0,


"sum_other_doc_count" : 0,


"buckets" : [


{


"key" : "ford",


"doc_count" : 2,


"color_agg" : {


"doc_count_error_upper_bound" : 0,


"sum_other_doc_count" : 0,


"buckets" : [ ---buckets 内每个元素是一个子桶,这些数据已按照 make_color_sales_rank 的值降序排序


{


"key" : "green",


"doc_count" : 1,


"make_color_sales_rank" : {


"value" : 30000.0


}


},


{


"key" : "blue",


"doc_count" : 1,


"make_color_sales_rank" : {


"value" : 25000.0


}


}


]


}


},


{


"key" : "toyota",


"doc_count" : 2,


"color_agg" : {


"doc_count_error_upper_bound" : 0,


"sum_other_doc_count" : 0,


"buckets" : [ ---buckets 内每个元素是一个子桶,这些数据已按照 make_color_sales_rank 的值降序排序


{


"key" : "blue",


"doc_count" : 1,


"make_color_sales_rank" : {


"value" : 15000.0


}


},


{


"key" : "green",


"doc_count" : 1,


"make_color_sales_rank" : {


"value" : 12000.0


}


}


]


}


},


......


此时,外层桶并没有排序。

整体排序

前面的示例只是对内层桶做了排序,外层桶是没有排序的,接下来看看如何做整体排序。


要想整体排序,一定要区分不同的内层桶的特点,才能做排序,总的来说分为以下几种情况:


  1. 内层桶是外层桶的数据聚合生成的,在前面的示例中,外层桶是都是某个品牌的汽车,对桶内数据按照颜色聚合,得到了内层桶,如下图:



对于这样的数据,无法做整体排序,因为内层桶的结果属于多值,而整体排序只能基于单值进行,以下是《Elasticsearch 权威指南》的说明,见红框内描述:


![在这里插入图片描述](https://img-blog.csdnimg.cn/20190504211151116.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly94aW5jaGVuLmJsb


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70)


  1. 内层桶是外层桶的数据过滤生成的,例如统计每个汽车品牌下红色汽车的销售额,先按照品牌聚合,再对外层桶按照颜色做过滤,这样的嵌套是可以用内层桶字段的值来排序的,DSL 如下:


GET /cars/transactions/_search


{


"size": 0,


"aggs": {


"makes": { ---外层桶字段名


"terms": {


"field": "make",


"order": {


"colors>sales": "asc" ---用大于号连接嵌套桶的层次


}


},


"aggs": {


"colors": { ---内层桶字段名


"filter": {


"terms": {


"color": [


"red",


"green"


]


}


},


"aggs": {


"sales": { ---metrics 处理后的字段名


"sum": { ---metrics 类型是求累加和


"field": "price"


}


}


}


}


}


}


}


}


返回数据如下所示,是按照 sales 字段做的排序:


......


"aggregations" : {


"makes" : {


"doc_count_error_upper_bound" : 0,


"sum_other_doc_count" : 0,


"buckets" : [


{


"key" : "ford",


"doc_count" : 2,


"colors" : {


"doc_count" : 0,


"sales" : {


"value" : 0.0


}


}


},


{


"key" : "toyota",


"doc_count" : 2,


"colors" : {


"doc_count" : 0,


"sales" : {

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Elasticsearch聚合的嵌套桶如何排序(1),java大学基础教程