前言
ES中的聚合功能類似于數(shù)據(jù)庫中g(shù)roup by語句,但是功能更為強(qiáng)大。
1. 概念
SELECT COUNT(color) //指標(biāo)
FROM table
GROUP BY color //桶
1.1 桶(Buckets):滿足特定條件的文檔集合
1.2 指標(biāo)(Metrics):桶內(nèi)文檔的統(tǒng)計(jì)計(jì)算
2.基本語法
2.1 例子1
{
? ?"size" : 0,
? "aggs": { //第一個(gè)桶
? ? ? "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"} }??// 指定聚合類型
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? }
? }
}
2.2 例子2:histogram
"aggs":{
? ? ? "price":{
? ? ? ? "histogram":{ "field": "price", "interval": 20000 },
? ? ? ? "aggs":{
? ? ? ? ? ? ? "revenue": {
? ? ? ? ? ? ? "sum": {"field" : "price"}
? ? ? ? ? ? }
? ? ? ? }
? ? ? }
? }
2.3 例子3:date_histogram以及強(qiáng)制返回空桶
"aggs": {
? ? ? "sales": {
? ? ? ? "date_histogram": {
? ? ? ? ? ? "field": "sold",
? ? ? ? ? ? "interval": "month",
? ? ? ? ? ? "format": "yyyy-MM-dd",
? ? ? ? ? ? "min_doc_count" : 0, //強(qiáng)制返回空buckets
? ? ? ? ? ? "extended_bounds" : { //強(qiáng)制返回整年
? ? ? ? ? ? ? ? "min" : "2014-01-01",
? ? ? ? ? ? ? ? "max" : "2014-12-31"
? ? ? ? ? ? }
? ? ? ? }
? ? ? }
? }
2.4 例子4:后過濾器(只過濾搜索結(jié)果竟闪,不過濾聚合結(jié)果)post-filter
{
? ? "size" : 0,
? ? "query": {"match": {"make": "ford"}},
? ? "post_filter": {? ?
? ? ? ? "term" : { "color" : "green" }
? ? },
? ? "aggs" : {
? ? ? ? "all_colors": { "terms" : { "field" : "color" }}
? ? }
}
2.5 例子5:桶內(nèi)置排序
"aggs" : {
? ? ? ? "colors" : {
? ? ? ? ? ? "terms" : {
? ? ? ? ? ? ? "field" : "color",
? ? ? ? ? ? ? "order": {"_count" : "asc" } //按文檔數(shù)量排序
? ? ? ? ? ? }
? ? ? ? }
? ? }
2.6 例子6:按度量排序
"aggs" : {
? ? ? ? "colors" : {
? ? ? ? ? ? "terms" : {
? ? ? ? ? ? ? "field" : "color",
? ? ? ? ? ? ? "order": { "avg_price" : "asc" }
? ? ? ? ? ? },
? ? ? ? ? ? "aggs": {
? ? ? ? ? ? ? ? "avg_price": {"avg": {"field": "price"}
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
2.7 例子7:基于深度度量排序
"aggs" : {
? ? ? ? "colors" : {
? ? ? ? ? ? "histogram" : {
? ? ? ? ? ? ? "field" : "price",
? ? ? ? ? ? ? "interval": 20000,
? ? ? ? ? ? ? "order": {"red_green_cars>stats.variance" : "asc" } // 將度量用>嵌套
? ? ? ? ? ? },
? ? ? ? ? ? "aggs": {
? ? ? ? ? ? ? ? "red_green_cars": {
? ? ? ? ? ? ? ? ? ? "filter": { "terms": {"color": ["red", "green"]}},
? ? ? ? ? ? ? ? ? ? "aggs": {
? ? ? ? ? ? ? ? ? ? ? ? "stats": {"extended_stats": {"field" : "price"}}
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
3.近似聚合
3.1?cardinality(去重)
1)語法
"aggs" : {
? ? ? ? "distinct_colors" : { "cardinality" : { "field" : "color","precision_threshold" : 100}}
//precision_threshold 表示在何種基數(shù)下希望得到一個(gè)近乎精確的結(jié)果
? ? }
2)原理
使用HyperLogLog(HLL)算法,該算法也應(yīng)用于redis中揭璃,優(yōu)點(diǎn)是狮斗,即使輸入元素的數(shù)量或者體積非常非常大,計(jì)算基數(shù)所需的空間總是固定的补疑、并且是很小的歧沪,redis中只需要12K內(nèi)存,在標(biāo)準(zhǔn)誤差0.81%的前提下莲组,能夠統(tǒng)計(jì)2^64個(gè)基數(shù)槽畔。
stream-lib 實(shí)現(xiàn)了一個(gè)java版本的HHL:https://github.com/addthis/stream-lib/blob/master/src/main/java/com/clearspring/analytics/stream/cardinality/HyperLogLog.java
3.2?percentiles、percentile_ranks(百分位計(jì)算)
1)語法
percentiles :默認(rèn)情況下胁编,percentiles會(huì)返回一組預(yù)定義的百分位數(shù)值[1, 5, 25, 50, 75, 95, 99]厢钧,體現(xiàn)的是某個(gè)百分比以下所有文檔的最小值
"aggs" : {
? ? ? ? "zones" : {
? ? ? ? ? ? "terms" : { "field" : "zone"},
? ? ? ? ? ? "aggs" : {
? ? ? ? ? ? ? ? "load_times" : {
? ? ? ? ? ? ? ? ? ? "percentiles" : {?
? ? ? ? ? ? ? ? ? ? ? "field" : "latency",
? ? ? ? ? ? ? ? ? ? ? "percents" : [50, 95.0, 99.0] //感興趣的百分比
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? },
????????????????{"avg_load_avg" : { "avg" : { "field" : "latency" } }}
? ? ? ? ? ? }
? ? ? ? }
? ? }
percentile_ranks:體現(xiàn)的是某個(gè)具體值屬于哪一個(gè)百分比等級
"aggs" : {
? ? ? ? "zones" : {
? ? ? ? ? ? "terms" : { "field" : "zone"},
? ? ? ? ? ? "aggs" : {
? ? ? ? ? ? ? ? "load_times" : {
? ? ? ? ? ? ? ? ? ? "percentile_ranks" : {
? ? ? ? ? ? ? ? ? ? ? "field" : "latency",
? ? ? ? ? ? ? ? ? ? ? "values" : [210, 800]
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
2)原理
使用TDigest算法