elasticsearch聚合aggregations

首先是介绍:

能干什么:

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

什么品牌的衣服最受欢迎

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

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

而且实现这些功能比数据库的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             最多组数量
      }
    }
  }
}

结果:

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

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

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值