美文网首页ElasticSearch实战笔记
31、聚合分析的平均值、最大值、数量、求和、histogram以

31、聚合分析的平均值、最大值、数量、求和、histogram以

作者: 众神开挂 | 来源:发表于2020-04-15 22:15 被阅读0次

    主要内容:聚合分析的平均值、最大值、数量、求和、histogram以及date histogram实战

    1、_bucket嵌套实现多层下钻分析

    1.1、avg求平均值

    比如说:

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

    下钻的意思是,已经分了一个组了,比如说颜色的分组,然后还要继续对这个分组内的数据,再分组,比如一个颜色内,还可以分成多个不同的品牌的组,最后对每个最小粒度的分组执行聚合分析操作,这就叫做下钻分析

    es,下钻分析,就要对bucket进行多层嵌套,多次分组

    bucket,分组操作,histogram,按照某个值指定的interval,划分一个一个的bucket

    按照多个维度(颜色+品牌)多层下钻分析,而且学会了每个下钻维度(颜色,颜色+品牌),都可以对每个维度分别执行一次metric聚合操作

    GET /tvs/_search 
    {
      "size": 0,
      "aggs": {
        "group_by_color": {
          "terms": {
            "field": "color"
          },
          "aggs": {
            "color_avg_price": {
              "avg": {
                "field": "price"
              }
            },
            "group_by_brand": {
              "terms": {
                "field": "brand"
              },
              "aggs": {
                "brand_avg_price": {
                  "avg": {
                    "field": "price"
                  }
                }
              }
            }
          }
        }
      }
    }
    
    1.2、max,min,count,sum

    count:bucket,terms,自动就会有一个doc_count,就相当于是count
    max:求一个bucket内,指定field值最大的那个数据
    min:求一个bucket内,指定field值最小的那个数据
    sum:求一个bucket内,指定field值的总和
    求总和,就可以拿到一个颜色下的所有电视的销售总额

    GET /tvs/_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"
              }
            }
          }
        }
      }
    }
    
    1.3、histogram分组操作

    histogram:类似于terms,也是进行bucket分组操作,接收一个field,按照这个field的值的各个范围区间,进行bucket分组操作

    "histogram":{ 
      "field": "price",
      "interval": 2000
    },
    

    interval:2000,划分范围,02000,20004000,40006000,60008000,8000~10000,buckets

    去根据price的值,比如2500,看落在哪个区间内,比如20004000,此时就会将这条数据放入20004000对应的那个bucket中

    bucket有了之后,一样的,去对每个bucket执行avg,count,sum,max,min,等各种metric操作,聚合分析

    GET /tvs/_search
    {
      "size": 0,
      "aggs": {
        "price": {
          "histogram": {
            "field": "price",
            "interval": 2000
          },
          "aggs": {
            "revenue": {
              "sum": {
                "field": "price"
              }
            }
          }
        }
      }
    }
    
    1.4、date histogram

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

    date interval = 1m,

    2017-01-01~2017-01-31,就是一个bucket
    2017-02-01~2017-02-28,就是一个bucket

    然后会去扫描每个数据的date field,判断date落在哪个bucket中,就将其放入那个bucket

    2017-01-05,就将其放入2017-01-01~2017-01-31,就是一个bucket

    min_doc_count:即使某个日期interval,2017-01-01~2017-01-31中,一条数据都没有,那么这个区间也是要返回的,不然默认是会过滤掉这个区间的
    extended_bounds,min,max:划分bucket的时候,会限定在这个起始日期,和截止日期内

    [fixed_interval] or [calendar_interval]

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

    相关文章

      网友评论

        本文标题:31、聚合分析的平均值、最大值、数量、求和、histogram以

        本文链接:https://www.haomeiwen.com/subject/obikmhtx.html