欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3.聚合

程序员文章站 2022-06-13 22:59:41
...

聚合

桶(Buckets)   相当于SQL中group by。满足特定条件的文档的集合

指标(Metrics) 相当于SQL中select key,count(key)。对桶内的文档进行统计计算,包含COUNT() 、 SUM() 、 MAX()等统计方法。

 

指标 

单值聚合

terms                   相当于SQL中 COUNT,求分组的和

avg                      相当于SQL中 AVG,求平均值

min                      相当于SQL中的MIN,求最小值

max                     相当于SQL中的MAX,求最大值

sum                     相当于SQL中的SUM,求和

cardinality            相当于SQL中的COUNT(DISTINCT)求唯一值,即不重复的字段有多少

histogram            按给定的值分组统计

date_histogram   按时间维度分组统计

多值聚合

percentile_ranks 求百分比

stats 多种聚合结果

extended_stats  多种聚合结果和扩展聚合结果

 

简单例子

 

GET /cars/transactions/_search
{
    "size" : 0,
    "aggs" : { 
        "popular_colors" : { 
            "terms" : { 
              "field" : "color",
              "size"  : 10
            }
        },
        "sex": {
          "terms": {
            "field": "sex"
          }
        }
    }
}
 

 

1.size 设置成 0 。不关心搜索结果的具体内容,所以将返回记录数设置为 0 来提高查询速度

2.聚合操作被置于顶层参数 aggs 之下(完整形式 aggregations 同样有效)。aggs中可以有一个或多个聚合

3.可以为聚合指定一个想要名称,本例中是: popular_colors 和sex,其中popular_colors取top10

4.定义单个桶的类型 terms

 

添加度量指标和嵌套桶

添加对量指标的例子,除显示有多少种颜色外,同时显示每种颜色的价格。通过添加新的 aggs 层。这个新的聚合层让我们可以将 avg 度量嵌套置于 terms 桶内。

 

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

 

另一个嵌套桶的列子,获取每种颜色的平均价格和制造商分布

 

GET /cars/transactions/_search
{
   "size" : 0,
   "aggs": {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": {
            "avg_price": { 
               "avg": {
                  "field": "price"
               }
            },
            "make": { 
                "terms": {
                    "field": "make" 
                }
            }
         }
      }
   }
}
 

 

更多的嵌套实例,获取每种颜色的平均价格和制造商分布同时,通过添加新的aggs层,获取各个制造商的最低价和最高价

 

GET /cars/transactions/_search
{
   "size" : 0,
   "aggs": {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": {
            "avg_price": { "avg": { "field": "price" }
            },
            "make" : {
                "terms" : { "field" : "make" },
                "aggs" : { 
                    "min_price" : { "min": { "field": "price"} }, 
                    "max_price" : { "max": { "field": "price"} } 
                }
            }
         }
      }
   }
}
 

 

 条形图

 直方图 histogram可以按区间分组统计数据,

 

GET /cars/transactions/_search
{
   "size" : 0,
   "aggs":{
      "price":{
         "histogram":{ 
            "field": "price",
            "interval": 20000
         },
         "aggs":{
            "revenue": {
               "sum": { 
                 "field" : "price"
               }
             }
         }
      }
   }
}
1.histogram 桶要求两个参数:一个数值字段以及一个定义桶大小间隔。

 

2.sum 度量嵌套在每个售价区间内,用来显示每个区间内的总收入。

 

按时间统计

例1:简单的时间分组统计

 

GET /cars/transactions/_search
{
   "size" : 0,
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold",
            "interval": "month", 
            "format": "yyyy-MM-dd" 
         }
      }
   }
}
 

 

 例2:按统计范围返回全部Buckets,包括空桶

 

GET /cars/transactions/_search
{
   "size" : 0,
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold",
            "interval": "month",
            "format": "yyyy-MM-dd",
            "min_doc_count" : 0, 
            "extended_bounds" : { 
                "min" : "2014-01-01",
                "max" : "2014-12-31"
            }
         }
      }
   }
}
1.min_doc_count : 这个参数强制返回空 buckets。

 

2.extended_bounds : 强制返回数据的范围。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关标签: elasticsearch