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种,就需要指定
       }
     }
   }
 }      

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

GET /hotel/_search
{
"size":0,
"aggs":{ 
  "brandAgg":{
    "terms":{
      "field":"brand",
      “order”:{
        "_count": "asc" ## 指定排序方式,按照_count升序排序
      }
      "size":20
      }
    }
  }
}   

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

 GET /hotel/_search
{
"query":{   ## 指定查询条件
 "range" : {
   "price":{
     "lte":200 //只对200元以下的文档聚合
     }
   }
 },    
"size":0,
"aggs":{ 
  "brandAgg":{
    "terms":{
      "field":"brand",
      “order”:{
        "_count": "asc" ## 指定排序方式,按照_count升序排序
      }
      "size":20
      }
    }
  }
}   
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
             }
          }
        }
      }
   }
 }  
03-02 13:56