天天看点

ElasticSearch系列三 分组 聚合基础知识

文章目录

  • 基础知识
    • 案例

基础知识

bucket 其实就是分组 相当于msql 中 group by

metric 就是统计 相当于 mysql 中的count

案例

以一个家电卖场中的电视销售数据为背景,来对各种品牌,各种颜色的电视的销量和销售额,进行各种各样角度的分析

GET /tvs/sales/_search
{
  "size": 0,
  "aggs": {
    "ppp": {
      "terms": {
        "field": "color"
      }
    }
  }
}
           

size:0 只获取统计之后的结果,统计用到的原始数据不显示

aggs:固定语法聚合统计的标志

ppp:为聚合后的字段随便起一个名字

terms:需要分组的字段

ElasticSearch系列三 分组 聚合基础知识

对每种颜色的家电求平均值

GET /tvs/sales/_search
{
  "size": 0,
  "aggs": {
    "colors": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}
           

根据color分bucket之后 每个bucket再求平均值

在第一个aggs 里面 平级的json结购再添加一个aggs

每种颜色的平均价格,以及找到每种颜色每个品牌的平均价格

我们可以进行多层次的下钻

比如说,现在红色的电视有4台,同时这4台电视中,有3台是属于长虹的,1台是属于小米的

红色电视中的3台长虹的平均价格是多少?

红色电视中的1台小米的平均价格是多少?

GET /tvs/sales/_search
{
  "size": 0,
  "aggs": {
    "colors": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        },
        "group_brand":{
            "terms": {
              "field": "brand"
            },
            "aggs": {
              "b_avg_p": {
                "avg": {
                  "field": "price"
                }
              }
            }
          }    
      }
    }
  }
}
           

一次bucket之后多次metric 多次计算 取最大 最小 平均 求和

GET /tvs/sales/_search
{
   "size" : 0,
   "aggs": {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": {
            "avg_price": { "avg": { "field": "price" } },
            "min_price" : { "min": { "field": "price"} }, 
            "max_price" : { "max": { "field": "price"} },
            "sum_price" : { "sum": { "field": "price" } } 
         }
      }
   }
}
           

histogram:区间分组,0-2000 ,2000-4000 来分组

统计各个价格区间内的家电的销售总和

GET /tvs/sales/_search
{
 "size": 0,
 "aggs": {
   "price": {
     "histogram": {
       "field": "price",
       "interval": 2000
     },
     "aggs": {
       "revenue": {
         "sum": {
           "field": "price"
         }
       }
     }
   }
 }
}
           
ElasticSearch系列三 分组 聚合基础知识

date histogram,按照我们指定的某个date类型的日期field,以及日期interval,按照一定的日期间隔,去划分bucket

GET /tvs/sales/_search
{
   "size" : 0,
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold_date",
            "interval": "month", 
            "format": "yyyy-MM-dd",
            "min_doc_count" : 0, 
            "extended_bounds" : { 
                "min" : "2016-01-01",
                "max" : "2017-12-31"
            }
         }
      }
   }
}
           

min_doc_count:即使某个日期interval,2017-01-01~2017-01-31中,一条数据都没有,那么这个区间也是要返回的,不然默认是会过滤掉这个区间的

extended_bounds,min,max:划分bucket的时候,会限定在这个起始日期,和截止日期内

ElasticSearch系列三 分组 聚合基础知识
欢迎大家关注我的微信公众号 您的关注就是我不懈的动力 
           
ElasticSearch系列三 分组 聚合基础知识

继续阅读