• elasticsearch 聚合DSL语法


    1.聚合的分类

    聚合可以实现对文档数据的统计、分析、运算。聚合常见的分类:
    • 桶(Bucket)聚合:用来对文档进行分组,比如
    TermAggregation:按照文档字段值分组;
    Date HIstogram:按照日期阶梯分组,例如一周为一组,或者一月为一组;
    • 度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等
    Avg:求平均值;
    Max:求最大值
    Min:求最小值;
    Stats:同时求max、min、avg、sum等
    • 管道(pipeline)聚合:其它聚合的结果为基础做聚合,例如按照酒店名称进行分组(桶聚合)完成之后,计算每一组酒店价格的平均值(度量聚合)
    ES官方提供了几十种聚合方式,官方地址为ES官方地址
    我们需要注意的是,参与聚合的字段不能够是分词的字段,那样是没有意义的,参与聚合的字段类型可以是keyword、数值、日期、布尔类型。

    2. DSL实现的 Bucket聚合

    案例,假如现在要统计所有数据中的酒店品牌有几种,此时可以按照酒店品牌进行聚合。
    语法如下:

    GET /hotel/_search
    {
     "size":0,## 设置size为0,结果中不包含文档,只包含聚合结果
     "aggs":{ ## 定义聚合
       "brandAgg":{ ## 给聚合起个名字
         "terms":{ ## 聚合的类型,例如按照品牌值聚合,所以选择term
           "field":"brand",## 参与聚合的字段
           "size":20 ## 希望获取的聚合结果数量,假如是200种,但是我只需要显示10种,就需要指定
           }
         }
       }
     }      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    默认情况下,buckt聚合会统计bucket内的文档数量,记为_count,并且按照_count降序排序,我们可以修改结果排序方式,语法如下:

    GET /hotel/_search
    {
    "size":0,
    "aggs":{ 
      "brandAgg":{
        "terms":{
          "field":"brand",
          “order”:{
            "_count": "asc" ## 指定排序方式,按照_count升序排序
          }
          "size":20
          }
        }
      }
    }   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    上面的这种聚合方式是对整个索引库文档做聚合,对内存消耗非常大,我们可以限定要聚合的文档范围,只要添加query查询条件即可,语法如下:

     GET /hotel/_search
    {
    "query":{   ## 指定查询条件
     "range" : {
       "price":{
         "lte":200 //只对200元以下的文档聚合
         }
       }
     },    
    "size":0,
    "aggs":{ 
      "brandAgg":{
        "terms":{
          "field":"brand",
          “order”:{
            "_count": "asc" ## 指定排序方式,按照_count升序排序
          }
          "size":20
          }
        }
      }
    }   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    3. DSL 实现Metrics聚合

    例如,我们要求获取每个品牌的用户评分的min,max,avg等值。由于是对每个品牌的评分做聚合,需要先将品牌分组,将分组之后的结果进行计算,语法余下:

    {
     "size":0,
     "aggs":{
       "brandAgg":{ 
         "terms":{
           "field":"brand",
           "size":20   
           },
           "aggs"{                    ## 是brands聚合的子聚合,也就是分组后对每组分别计算
             score_stats":{        ## 聚合名称
               "stats":{               ## 聚合类型,这里stats可以计算min、max、avg等
                 "field":"score"     ##聚合字段,这里是score
                 }
              }
            }
          }
       }
     }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    Maven安装与环境配置(Windows)
    分布式微服务架构-一起学习吧之架构
    C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
    Tomcat及jdk安装下载及环境配置(超超超详解)
    【Mycat2实战】五、Mycat实现分库分表【实践篇】
    【网页设计】HTML做一个属于我的音乐页面(纯html代码)
    HTML知识小结之CSS
    数字化时代,数据仓库是什么?有什么用?
    测试开发环境下centos7.9下安装docker的minio
    MySQL之BETWEEN AND包含范围查询总结
  • 原文地址:https://blog.csdn.net/m0_37742400/article/details/136313285