3.聚合

聚合

桶(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 : 强制返回数据的范围。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自sgq0085.iteye.com/blog/2422402