首先是介绍:

能干什么:

聚合查询可以很方便的实现对数据的统计,分析例如:

什么品牌的衣服最受欢迎

这些衣服的平均价格,最高最低价格

这些衣服每个月的销售情况

而且实现这些功能比数据库的sql要方便很多,而且速度也恒快,可以近实时搜索结果

基本概念

es中的聚合,包含多种类型,最常用的有俩种一个叫桶,一个叫度量:

  • 桶(bocket)

          桶是按照某种方式对数据进行分组,每组数据在es中被称为一个桶,例如:根据国籍对人进行划分,可以分为中国籍,韩国籍,日本籍。。。或者可以根据年龄段对人进行划分。。。

es中划分桶的方式有很多种:

  1.   date historram aggregations:根据日期阶梯分组,例如给定阶梯为周,会自动每周分为一组
  2.   historram aggregations:根据数值阶梯分组,与日期类似,以间隔分组,需要指定间隔 
  3.   terms aggregations:根据词条内容分组,词条内容完全匹配为一组
  4.   range  aggregations:数值和日期范围分组,指定开始和结束,然后按段分组
  5. 。。。。。

桶只对数据进行分组,并不进行计算,所以桶聚合中一般会嵌套另一种聚合 度量(metrics aggregations)

  • 度量(metrics aggregations)
  1. Avg aggregations;求平均值
  2. Max aggregations;求最大值
  3. min aggregations:求最小值
  4. percentiles aggregations:求百分比
  5. stats aggregations:同时返回avg,min,max,sum,count等
  6. sum aggregations:求和
  7. top hits aggregations:求前几
  8. value count aggregations:求总数
  9. 。。。。。。。

测试聚合:

首先把索引库和数据准备好:

创建索引库cars

PUT /cars
 {
   "settings": {
     "number_of_shards": 1,
     "number_of_replicas": 0
   },
   "mappings": {
     "transactions":{
       "properties": {
          "color":{
         "type":"keyword"
       },
       "make":{
         "type":"keyword"
       }
       }
     }
   }
 }

批量导入数据:

这里_bulk表示批量导入数据。

POST /cars/transactions/_bulk 
 { "index": {}}
 { "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
 { "index": {}}
 { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
 { "index": {}}
 { "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
 { "index": {}}
 { "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
 { "index": {}}
 { "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
 { "index": {}}
 { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
 { "index": {}}
 { "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
 { "index": {}}
 { "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }

对cars的make字段进行聚合

GET /cars/_search
 {
   "aggs": {
     "popular_brand": {   聚合名字自己起名
       "terms": {               聚合方式,根据词条进行分组
         "field": "make",   分组字段,
         "size": 10             最多组数量
       }
     }
   }
 }

结果:

ES中聚合后进行分页 es聚合结果分页_导入数据

发现把数据也查询出来了,如果不希望查询出来数据可以:

GET /cars/_search
 {
   "size": 0,           分页的操作,size表示显示多少条,这里写为0就不显示数据了
   "aggs": {
     "popular_brand": {
       "terms": {
         "field": "make",
         "size": 10
       }
     }
   }
 }

ES中聚合后进行分页 es聚合结果分页_ES中聚合后进行分页_02

 计算每个品牌的汽车平均价格

GET /cars/_search
 {
   "size": 0, 
   "aggs": {
     "popular_brand": {
       "terms": {
         "field": "make",
         "size": 10
       },
       "aggs": {     使用上面的terms聚合成桶后,在使用这个度量计算每个品牌的平均价格
         "price_avg": {
           "avg": {
             "field": "price"
           }
         }
       }
     }
   }
 }

ES中聚合后进行分页 es聚合结果分页_字段_03