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