百億級(jí)數(shù)據(jù)搜索引擎,你所要的Elasticsearch聚合查詢都在這里!

基本概念

簡(jiǎn)單來(lái)說(shuō)就是滿足特定條件的文檔的集合。當(dāng)聚合開始被執(zhí)行,每個(gè)文檔里面的值通過(guò)計(jì)算來(lái)決定符合哪個(gè)桶的條件觅捆。如果匹配到叮雳,文檔將放入相應(yīng)的桶并接著進(jìn)行聚合操作想暗。

指標(biāo)

桶能讓我們劃分文檔到有意義的集合,但是最終我們需要的是對(duì)這些桶內(nèi)的文檔進(jìn)行一些指標(biāo)的計(jì)算帘不。分桶是一種達(dá)到目的的手段:它提供了一種給文檔分組的方法來(lái)讓我們可以計(jì)算感興趣的指標(biāo)说莫。
大多數(shù) 指標(biāo) 是簡(jiǎn)單的數(shù)學(xué)運(yùn)算(例如最小值、平均值寞焙、最大值储狭,還有匯總),這些是通過(guò)文檔的值來(lái)計(jì)算捣郊。在實(shí)踐中辽狈,指標(biāo)能讓你計(jì)算像平均薪資、最高出售價(jià)格呛牲、95%的查詢延遲這樣的數(shù)據(jù)刮萌。

桶和指標(biāo)

聚合 是由桶和指標(biāo)組成的。 聚合可能只有一個(gè)桶娘扩,可能只有一個(gè)指標(biāo)着茸,或者可能兩個(gè)都有壮锻。也有可能有一些桶嵌套在其他桶里面。

聚合

聚合框架目的就是使搜索查詢能夠提供聚合數(shù)據(jù)元扔。它是基于稱為聚合的簡(jiǎn)單構(gòu)建塊躯保,它可以幫助我們構(gòu)建復(fù)雜的數(shù)據(jù)。Elasticsearch有不同類型的聚合澎语,每種聚合都有自己的目的和最終的數(shù)據(jù)輸出途事。為了更好地理解這些類型,通常將它們分為四種主要類型:

  • 分桶聚合(Bucketing)
  • 指標(biāo)聚合(Metric)
  • 矩陣聚合(Matrix)
  • 管道聚合(Pipeline)
    使用聚合的結(jié)構(gòu):
"aggregations" : {
   "<aggregation_name>" : {
      "<aggregation_type>" : {
         <aggregation_body>
      },
      [, "meta" : { [<meta_data_body>] } ]
      [, "aggregations" : { ..... } ]
   }
   [, "<aggregation_name_2>": {......} ]
}

指標(biāo)聚合

該聚合是根據(jù)要聚合的文檔提取出來(lái)字段值來(lái)進(jìn)行指標(biāo)計(jì)算擅羞。

平均值(avg)

單值指標(biāo)聚合尸变,用于計(jì)算從文檔中提取的數(shù)值的平均值。這些值可以從文檔中的數(shù)字字段中提取减俏,也可以由腳本生成召烂。

$ curl -XPOST "localhost:9200/bank/_search?pretty&size=0" -d'
{
   "aggs": {
      "avg_agg" : { "avg" : { "field": "balance" } }
   }
}'

# 由腳本生成指標(biāo)
$ curl -XPOST "localhost:9200/bank/_search?pretty&size=0" -d'
{
   "aggs": {
      "avg_agg" : {
     "avg" : {
        "script": {
           "source": "doc.balance.value"
        }
         }
      }
   }
}'

求和(sum)

單指標(biāo)聚合,對(duì)文檔中字段的數(shù)值進(jìn)行求和娃承。

$ curl -XPOST "localhost:9200/bank/_search?pretty&size=0" -d'
{
   "aggs": {
      "sum_agg" : { "sum" : { "field": "balance" } }
   }
}'

最大值(max)

單指標(biāo)聚合奏夫,可返回從聚合文檔中提取的數(shù)值中的最大值。

$ curl -XPOST "localhost:9200/bank/_search?pretty&size=0" -d'
{
   "aggs": {
      "max_agg" : { "max" : { "field": "balance" } }
   }
}'

最小值(min)

單指標(biāo)聚合历筝,可返回從聚合文檔中提取的數(shù)值中的最小值酗昼。

$ curl -XPOST "localhost:9200/bank/_search?pretty&size=0" -d'
{
   "aggs": {
      "min_agg" : { "min" : { "field": "balance" } }
   }
}'

地理邊界(geo_bounds)

用于計(jì)算包含一個(gè)字段geo_point值的邊界框。

$ curl -XPOST "localhost:9200/restaurants/_search?pretty&size=0" -d'
{
   "query": {
      "match": { "name": "restaurant" }
   },
   "aggs": {
      "geo_restaurant" : {
         "geo_bounds" : {
             "field": "location"
         }
      }
   }
}'

地理中心(geo_centroid)

根據(jù)要聚合文檔求出地理位置上的的中心點(diǎn)梳猪。

curl -XPOST "localhost:9200/restaurants/_search?pretty&size=0" -d'
{
   "aggs": {
      "geo_restaurant" : {
         "geo_centroid" : {
            "field": "location"
         }
      }
   }
}'

百分比(perecentiles)

多指標(biāo)聚合麻削,該聚合針對(duì)從聚合文檔中提取的數(shù)值計(jì)算一個(gè)或多個(gè)百分位數(shù)。假設(shè)日志數(shù)據(jù)包含接口響應(yīng)時(shí)間春弥,對(duì)管理員來(lái)說(shuō)平均和中位數(shù)加載時(shí)間并無(wú)太大用處呛哟,最大值可能更有用。

curl -XPOST "localhost:9200/bank/_search?pretty&size=0" -d'
{
   "aggs": {
      "age_outlier" : {
         "percentiles" : {
            "field": "age",
         }
      }
   }
}'

# 指定某個(gè)百分比范圍
curl -XPOST "localhost:9200/bank/_search?pretty&size=0" -d'
{
   "aggs": {
      "age_outlier" : {
         "percentiles" : {
            "field": "age",
            "percens": [90, 95, 99]
         }
      }
   }
}'

# 指定TDigest compression
curl -XPOST "localhost:9200/bank/_search?pretty&size=0" -d'
{
   "aggs": {
      "age_outlier" : {
        "percentiles" : {
           "field": "age",
           "tdigest":{
              "compression": 200
           }
         }
      }
   }
}'

# 指定HDR Histogram
$ curl -XPOST "localhost:9200/bank/_search?pretty&size=0" -d'
{
   "aggs": {
      "age_outlier" : {
         "percentiles" : {
            "field": "age",
               "hdr": {
                  "number_of_significant_value_digits": 5
               }
            }
         }
      }
   }
}'
  • 使用此指標(biāo)時(shí)匿沛,需要牢記一些準(zhǔn)則:
    百分位的準(zhǔn)確度與百分位的 極端程度 相關(guān)扫责,也就是說(shuō) 1 或 99 的百分位要比 50 百分位要準(zhǔn)確。這只是數(shù)據(jù)結(jié)構(gòu)內(nèi)部機(jī)制的一種特性俺祠,但這是一個(gè)好的特性公给,因?yàn)槎鄶?shù)人只關(guān)心極端的百分位。
  • 對(duì)于數(shù)值集合較小的情況蜘渣,百分位非常準(zhǔn)確淌铐。如果數(shù)據(jù)集足夠小,百分位可能 100% 精確蔫缸。
  • 隨著桶里數(shù)值的增長(zhǎng)腿准,算法會(huì)開始對(duì)百分位進(jìn)行估算。它能有效在準(zhǔn)確度和內(nèi)存節(jié)省之間做出權(quán)衡。 不準(zhǔn)確的程度比較難以總結(jié)吐葱,因?yàn)樗蕾囉?聚合時(shí)數(shù)據(jù)的分布以及數(shù)據(jù)量的大小街望。
    TDigest
    TDigest 算法用節(jié)點(diǎn)近似計(jì)算百分比:節(jié)點(diǎn)越多,準(zhǔn)確度越高(同時(shí)內(nèi)存消耗也越大)弟跑,這都與數(shù)據(jù)量成正比灾前。 compression 參數(shù)限制節(jié)點(diǎn)的最大數(shù)目為 20 * compression
    因此孟辑,通過(guò)增加壓縮比值哎甲,可以以消耗更多內(nèi)存為代價(jià)提高百分位數(shù)準(zhǔn)確性。更大的壓縮比值會(huì)使算法運(yùn)行更慢饲嗽,因?yàn)榈讓拥臉湫螖?shù)據(jù)結(jié)構(gòu)的存儲(chǔ)也會(huì)增長(zhǎng)炭玫,也導(dǎo)致操作的代價(jià)更高。默認(rèn)的壓縮比值是 100
    HDR Histogram
    高動(dòng)態(tài)范圍( HDR ) 直方圖
    HDR Histogram支持在可以配置的整數(shù)值范圍內(nèi)記錄和分析采樣數(shù)據(jù)值計(jì)數(shù)貌虾,在該范圍內(nèi)可以配置值精度吞加。 值精度表示為值記錄中的重要數(shù)字?jǐn)?shù),并提供值范圍內(nèi)的值量化行為和后續(xù)值分辨率尽狠。
    例如在保持 0到 3,600之間的整數(shù)值的同時(shí)衔憨,可以配置直方圖來(lái)跟蹤觀察到的整數(shù)值的計(jì)數(shù),同時(shí)保持在該范圍內(nèi)的值精度為袄膏。 因此范圍內(nèi)的值量化不會(huì)大于 1/1000 ( 任何值的0.1 %) )巫财。 這個(gè)示例直方圖可用來(lái)跟蹤和分析觀測(cè)響應(yīng)次數(shù),范圍為 1微秒到10微秒哩陕,同時(shí)保持value微秒的分辨率分辨率,分辨率為1 毫秒赫舒,分辨率為 1,000秒悍及,分辨率達(dá)秒。 它的最大跟蹤值( 1小時(shí)) 仍然保持 3.6秒( 或者更好)的分辨率接癌。

百分比等級(jí)(percentile_ranks)

多指標(biāo)聚合心赶,該聚合根據(jù)從聚合文檔中提取的數(shù)值計(jì)算出一個(gè)或多個(gè)百分?jǐn)?shù)等級(jí)。

curl -XPOST "localhost:9200/bank/_search?pretty&size=0" -d'
{
   "aggs": {
      "age_outlier" : {
         "percentile_ranks" : {
            "field": "balance",
            "values": [25000, 50000]
         }
      }
   }
}'

基數(shù)聚合(cardinality)
單值指標(biāo)聚合缺猛,用于計(jì)算不同值的近似計(jì)數(shù)缨叫。它提供一個(gè)字段的基數(shù),即該字段的 distinct 或者 unique 值的數(shù)目荔燎〕芾眩可以以如下SQL來(lái)幫助理解該聚合:

SELECT COUNT(DISTINCT age) FROM account

去重是一個(gè)很常見(jiàn)的操作,可以應(yīng)用于很多的業(yè)務(wù)場(chǎng)景:
每天/每月/每年訪問(wèn)網(wǎng)站的獨(dú)立IP有多少有咨?

curl -XPOST "localhost:9200/bank/_search?pretty&size=0" -d'
{
   "aggs": {
      "name_count" : {
         "cardinality" : {
            "field": "firstname.keyword"
         }
      }
   }
}'

precision_threshold接受 0–40,000 之間的數(shù)字琐簇,更大的值還是會(huì)被當(dāng)作 40,000 來(lái)處理。
HyperLogLog
HyperLogLog 可以接受多個(gè)元素作為輸入座享,并給出輸入元素的基數(shù)估算值婉商∷朴牵基數(shù):集合中不同元素的數(shù)量,比如 {'apple', 'banana', 'cherry', 'banana', 'apple'} 的基數(shù)就是 3 丈秩。
估算值:算法給出的基數(shù)并不是精確的盯捌,可能會(huì)比實(shí)際稍微多一些或者稍微少一些,但會(huì)控制在合理的范圍之內(nèi)
HyperLogLog 的優(yōu)點(diǎn)是蘑秽,即使輸入元素的數(shù)量或者體積非常非常大饺著,計(jì)算基數(shù)所需的空間總是固定的、并且是很小的筷狼。
bitmap存儲(chǔ)1一億個(gè)統(tǒng)計(jì)數(shù)據(jù)大概需要12M內(nèi)存瓶籽;而在HLL中,只需要不到1K內(nèi)存就能做到埂材;redis中實(shí)現(xiàn)的HyperLogLog塑顺,只需要12K內(nèi)存,在標(biāo)準(zhǔn)誤差0.81%的前提下俏险,能夠統(tǒng)計(jì)2^64個(gè)數(shù)據(jù)严拒。

Top聚合(top_hits)

top_hits聚合可以有效地用于通過(guò)桶聚合器按某些字段對(duì)結(jié)果集進(jìn)行分組。該聚合器主要用作子聚合竖独,以便可以按存儲(chǔ)分區(qū)匯總最匹配的文檔裤唠。它有3個(gè)重要的參數(shù):

  • from 獲取數(shù)據(jù)的偏移量
  • size 每個(gè)桶要返回的最大數(shù)量
  • sort 如何排序。默認(rèn)情況下莹痢,按分?jǐn)?shù)排序
curl -XPOST "localhost:9200/bank/_search?size=0&pretty=true" -d'
{
   "aggs": {
      "top_tags": {
         "terms": {
            "field": "lastname.keyword",
            "size": 6
         },
         "aggs": {
            "top_balance_hits": {
               "top_hits": {
                  "sort": [
                     {
                        "balance": {
                           "order": "desc"
                        }
                     }
                  ],
                  "_source": {
                     "includes": [ "firstname", "lastname", "age", "balance" ]
                  },
                  "size" : 1
               }
            }
         }
      }
   }
}'

分桶聚合

桶聚合不像指標(biāo)聚合那樣計(jì)算字段的值种蘸,而是創(chuàng)建文檔存儲(chǔ)桶。每個(gè)桶都與一個(gè)標(biāo)準(zhǔn)/查詢(取決于聚合類型)相關(guān)聯(lián)竞膳,該標(biāo)準(zhǔn)/查詢確定文檔是否“落入”其中航瞭,存儲(chǔ)桶有效地定義了文檔集。除了存儲(chǔ)桶本身之外坦辟,桶聚合還計(jì)算并返回“落入”每個(gè)存儲(chǔ)桶的文檔數(shù)量刊侯。
過(guò)濾聚合(filter)
返回當(dāng)前文檔集中與指定過(guò)濾器匹配的文檔的單個(gè)桶。通常锉走,用于將當(dāng)前聚合的文檔再進(jìn)一步縮小到一組特定的文檔滨彻。

curl -XPOST "localhost:9200/bank/_search?size=0&pretty=true" -d'
{
   "aggs": {
      "gender_filter": {
         "filter": { "term" : { "gender.keyword" : "M" } },
         "aggs": {
            "balance_price": {
               "avg": {
                  "field": "balance"
               }
            }
         }
      }
   }
}'

多過(guò)濾聚合(filters)
定義一個(gè)多桶聚合,其中每個(gè)桶都與一個(gè)過(guò)濾器相關(guān)聯(lián)挪蹭。每個(gè)存儲(chǔ)桶將收集與其關(guān)聯(lián)的過(guò)濾器匹配的所有文檔亭饵。

curl -XPOST "localhost:9200/bank/_search?size=0&pretty=true" -d'
{
   "aggs": {
      "bank_filter": {
         "filters": {
            "filters": {
               "state": { "match": { "state.keyword" : "AZ" } },
               "name": { "match": { "lastname.keyword" : "Hess" } }
            }
         }
      }
   }
}'


curl -XPOST "localhost:9200/bank/_search?size=0&pretty=true" -d'
{
   "aggs": {
      "bank_filter": {
         "filters": {
            "other_bucket": true,
            "filters": {
               "state": { "match": { "state.keyword" : "AZ" } },
               "name": { "match": { "lastname.keyword" : "Hess" } }
            }
         }
      }
   }
}'

范圍聚合(range)
基于多桶的聚合,使用戶能夠定義一組范圍梁厉,每個(gè)范圍代表一個(gè)桶冬骚。在匯總過(guò)程中,將按每個(gè)范圍檢查每個(gè)文檔中提取的值,并“存儲(chǔ)”相關(guān)/匹配的文檔只冻。請(qǐng)注意庇麦,此聚合包括起始值,但不包括每個(gè)范圍的起始值喜德。

# 范圍聚合
curl -XPOST localhost:9200/bank/_search?size=0 -d'
{
   "aggs": {
      "age_range": {
         "range": {
            "field": "age",
            "ranges": [
               { "to": 30 },
               { "from": 20, "to": 25 },
               { "from": 40 }
            ]
         }
      }
   }
}'

# 在桶內(nèi)再進(jìn)行操作
curl -XPOST localhost:9200/bank/_search?size=0 -d'
{
   "aggs": {
      "age_range": {
         "range": {
            "field": "age",
               "ranges": [
                  { "to": 30 },
                  { "from": 20, "to": 25 },
                  { "from": 40 }
               ]
            },
            "aggs": {
               "balance_max": {
                  "max": { "field": "balance" }
            }
         }
      }
   }
}'

日期范圍聚合(date_range)
該聚合與其他范圍聚合之間的主要區(qū)別在于山橄,可以在Date Math表達(dá)式中指定from和to值,還可以指定一種日期格式舍悯,通過(guò)該日期格式將返回from和to響應(yīng)字段航棱。請(qǐng)注意,此聚合包括起始值萌衬,但不包括每個(gè)范圍的起始值饮醇。

curl -XPOST localhost:9200/logstash-*/_search?size=0 -d'
{
   "aggs": {
      "age_range": {
         "date_range": {
            "field": "utc_time",
            "format": "yyyy-MM",
            "ranges": [
               { "to": "now+10M" },
               { "from": "now-10M" }
            ]
         }
      }
   }
}'

格式字母其定義如下:

字母縮寫 描述 類型 默認(rèn)值
C century of era (>=0) number 20
Y year of era (>=0) year 1996
x weekyear year 1996
w week of weekyear number 27
e day of week number 2
E day of week text Tuesday; Tue
y year year 1996
D day of year number 189
M month of year month July; Jul; 07
d day of month number 10
a halfday of day text PM
K hour of halfday (0~11) number 0
h clockhour of halfday (1~12) number 12
H hour of day (0~23) number 0
k clockhour of day (1~24) number 24
m minute of hour number 30
s second of minute number 55
S fraction of second number 978
z time zone text Pacific Standard Time; PST
Z time zone offset/id zone -0800; -08:00; America/Los_Angeles
' escape for text delimiter ''

日期直方圖聚合(date_histogram)
直方圖的多桶聚合,但只能應(yīng)用于日期值秕豫∑蛹瑁可以通過(guò)日期/時(shí)間表達(dá)式指定間隔。

curl -XPOST "localhost:9200/logstash-*/_search?size=0&pretty" -d'
{
   "aggs": {
      "utc_time_agg": {
         "date_histogram" : {
            "field": "utc_time",
            "interval": "day",
            "format": "yyyy-MM-dd",
            "offset": "+6h"
         }
      }
   }
}'
  • interval
    時(shí)間間隔混移§羰可用表達(dá)式:year, quarter, month, week, day, hour, minute, second
  • key
    在Elasticsearch內(nèi)部,日期表示為64位數(shù)字歌径,表示自從該紀(jì)元以來(lái)以毫秒為單位的時(shí)間戳毁嗦。這個(gè)時(shí)間戳作為桶的Key返回。key_as_string是使用format參數(shù)對(duì)時(shí)間戳進(jìn)行格式化后的文本回铛。
  • offset
    offset參數(shù)用于按指定的正(+)或負(fù)偏移(-)更改每個(gè)存儲(chǔ)區(qū)的起始值狗准,例如1h表示一個(gè)小時(shí),或1d表示一天茵肃。
    地理距離聚合(geo_distance)
    適用于geo_point字段的多桶聚合驶俊,在概念上與范圍聚合非常相似。用戶可以定義一個(gè)原點(diǎn)和一組距離范圍免姿。聚合會(huì)評(píng)估每個(gè)文檔值到原點(diǎn)的距離,并根據(jù)范圍來(lái)確定它所屬的桶(如果文檔和原點(diǎn)之間的距離在存儲(chǔ)桶的距離范圍內(nèi)榕酒,則文檔屬于存儲(chǔ)桶)胚膊。
curl -XPOST "localhost:9200/restaurants/_search?size=0&pretty" -d'
{
   "aggs": {
      "geo_range": {
         "geo_distance": {
            "field": "location",
            "origin": "52.3760, 4.894",
            "ranges": [
               { "to": 100000 },
               { "from": 100000, "to": 300000 },
               { "from": 300000 }
            ]
         }
      }
   }
}'

默認(rèn)情況下,距離單位為m(米)想鹰,但也可以設(shè)置為:mi(英里)紊婉,in(英寸),yd(碼)辑舷,km(公里)喻犁,cm(厘米),mm(毫米)。

curl -XPOST "localhost:9200/restaurants/_search?size=0&pretty" -d'
{
   "aggs": {
      "geo_range": {
         "geo_distance": {
            "field": "location",
            "origin": "52.3760, 4.894",
            "unit": "km",
            "ranges": [
               { "to": 100000 },
               { "from": 100000, "to": 300000 },
               { "from": 300000 }
            ]
         }
      }
   }
}'

該聚合有兩種距離計(jì)算模式:恢 (arc还栓,默認(rèn))和平面(plane)〈洌弧計(jì)算是最準(zhǔn)確的剩盒。平面最快但最不準(zhǔn)確。當(dāng)搜索跨越較小的地理區(qū)域(約5公里)時(shí)慨蛙,請(qǐng)考慮使用平面辽聊。如果在非常大的區(qū)域內(nèi)進(jìn)行搜索(例如跨大陸搜索),平面將返回較高的誤差范圍期贫。

curl -XPOST "localhost:9200/restaurants/_search?size=0&pretty" -d'
{
   "aggs": {
      "geo_range": {
         "geo_distance": {
            "field": "location",
            "origin": "52.3760, 4.894",
            "unit": "km",
            "distance_type": "plane",
            "ranges": [
               { "to": 100000 },
               { "from": 100000, "to": 300000 },
               { "from": 300000 }
            ]
         }
      }
   }
}'

地理網(wǎng)格聚合(geohash_grid)
適用于geo_point字段的多桶聚合跟匆。將地理坐標(biāo)點(diǎn)分組到以網(wǎng)格為單元的桶中。每個(gè)單元格都使用可定義精度的geohash進(jìn)行標(biāo)記通砍,聚合中使用的地理哈下瓯郏可以在1到12之間選擇精度(長(zhǎng)度為12的最高精度geohash僅覆蓋不到一平方米的區(qū)域,因此就RAM和結(jié)果大小而言埠帕,高精度geohash可能會(huì)更加昂貴)

  • 高精度:高精度地理哈希具有較長(zhǎng)的字符串垢揩,每個(gè)單元僅覆蓋較小區(qū)域。
  • 低精度:低精度地理哈希具有較短的字符串敛瓷,每個(gè)單元都覆蓋大面積的區(qū)域叁巨。
curl -XPOST "localhost:9200/restaurants/_search?size=0&pretty" -d'
{
   "aggs": {
      "geo_hash_agg": {
         "geohash_grid": {
            "field": "location",
            "precision": 12
         }
      }
   }
}'

curl -XPOST "localhost:9200/restaurants/_search?size=0&pretty" -d'
{
   "aggs": {
      "zoom_filter": {
         "filter" : {
            "geo_bounding_box": {
               "location": {
                  "top_left": "52.4, 4.9",
                  "bottom_right": "52.3, 5.0"
               }
            }
         },
         "aggs": {
            "zoom_agg": {
               "geohash_grid": {
                  "field": "location",
                  "precision": 8
               }
            }
         }
      }
   }
}'

GEOHash長(zhǎng)度和區(qū)域范圍對(duì)應(yīng)表:

序號(hào) 計(jì)算公式
1 5,009.4km x 4,992.6km
2 1,252.3km x 624.1km
3 156.5km x 156km
4 39.1km x 19.5km
5 4.9km x 4.9km
6 1.2km x 609.4m
7 152.9m x 152.4m
8 38.2m x 19m
9 4.8m x 4.8m
10 1.2m x 59.5cm
11 14.9cm x 14.9cm
12 3.7cm x 1.9cm

詞項(xiàng)聚合(terms)
多指標(biāo)聚合,根據(jù)索引庫(kù)中的文檔動(dòng)態(tài)構(gòu)建桶呐籽》嫔祝基于詞項(xiàng)的聚合,如果聚合字段是text的話狡蝶,會(huì)對(duì)一個(gè)一個(gè)的詞根進(jìn)行聚合基于多桶的聚合庶橱,每個(gè)桶一個(gè)對(duì)應(yīng)一個(gè)唯一值。

curl -XPOST "localhost:9200/bank/_search?size=0&pretty" -d'
{
   "aggs": {
      "name_agg": {
         "terms" : {
            "field": "firstname.keyword",
            "size": 3
         }
      }
   }
}'

默認(rèn)情況下贪惹,詞項(xiàng)聚合將返回doc_count排序的前十個(gè)詞項(xiàng)的存儲(chǔ)桶苏章。可以通過(guò)設(shè)置size參數(shù)來(lái)更改此默認(rèn)行為奏瞬。
排序
可以通過(guò)設(shè)置Order參數(shù)來(lái)設(shè)置桶的順序枫绅。默認(rèn)情況下,桶會(huì)按照doc_count降序排列硼端。不建議按_count升序或按子聚合排序并淋,因?yàn)檫@會(huì)增加文檔計(jì)數(shù)上的錯(cuò)誤。

curl -XPOST "localhost:9200/bank/_search?size=0&pretty" -d'
{
   "aggs": {
      "name_agg": {
         "terms" : {
            "field": "firstname.keyword",
            "order": { "_term": "desc" }
         },
         "aggs": {
            "max_balance": { "max": { "field": "balance" } }
         }
      }
   }
}'

過(guò)濾
對(duì)桶進(jìn)行過(guò)濾珍昨∠氐ⅲ可以設(shè)置include和exclude參數(shù)來(lái)完成句喷,參數(shù)接受正則表達(dá)式或精確值數(shù)組。此外兔毙,include子句還可以使用分區(qū)表達(dá)式唾琼。

# 使用include和exclude進(jìn)行過(guò)濾
curl -XPOST "localhost:9200/bank/_search?size=0&pretty" -d'
{
   "aggs": {
      "name_agg": {
         "terms" : {
            "field": "address.keyword",
            "include": ".*Gatling.*",
            "exclude": ".*Street"
         }
      }
   }
}'

# 精確過(guò)濾
curl -XPOST "localhost:9200/bank/_search?size=0&pretty" -d'
{
   "aggs": {
      "name_agg": {
         "terms" : {
            "field": "address.keyword",
            "include": ["105 Onderdonk Avenue", "Street"]
         }
      }
   }
}'

# 分區(qū)過(guò)濾
curl -XPOST "localhost:9200/bank/_search?size=0&pretty" -d'
{
   "aggs": {
      "name_agg": {
         "terms" : {
            "field": "account_number",
            "include": {
               "partition": 0,
               "num_partitions": 20
            },
            "size": 20,
            "order": {
               "max_balance": "desc"
            }
         },
         "aggs": {
            "max_balance": {
               "max": { "field": "balance" }
            }
         }
      }
   }
}'

搜集模式
對(duì)于具有許多唯一術(shù)語(yǔ)和少量所需結(jié)果的字段,將子聚合的計(jì)算延遲到最上層父級(jí)aggs被聚合之前瞒御,可能會(huì)更有效父叙。通常,聚合樹的所有分支都以深度優(yōu)先的方式進(jìn)行擴(kuò)展肴裙,然后才進(jìn)行修剪趾唱。在某些情況下,這可能非常浪費(fèi)蜻懦,并且會(huì)遇到內(nèi)存限制甜癞。如:在電影數(shù)據(jù)庫(kù)中查詢10個(gè)最受歡迎的演員及其5個(gè)最常見(jiàn)的聯(lián)合主演:

curl -XPOST "localhost:9200/bank/_search?size=0&pretty" -d'
{
   "aggs": {
      "name_agg": {
         "terms" : {
            "field": "firstname.keyword",
            "size": 10,
            "collect_mode": "breadth_first"
         },
         "aggs": {
            "tops": {
               "terms": {
                  "field": "firstname.keyword",
                  "size": 5
               }
            }
         }
      }
   }
}'

管道聚合

管道聚合主要目的是將信息添加到輸出樹中,而不是文檔集所產(chǎn)生的輸出宛乃。管道聚合有很多不同的類型悠咱,每種類型都與其他聚合計(jì)算不同的信息,但是可以將這些類型分為兩類:

  • Parent:將新計(jì)算的桶或聚合添加到現(xiàn)有桶中征炼。
  • Sibling:同級(jí)聚合的輸出提供的管道聚合析既,并且能夠計(jì)算與該同級(jí)聚合處于同一級(jí)別的新聚合
    大多數(shù)管道聚合需要另一個(gè)聚合作為其輸入。輸入聚合是通過(guò)buckets_path參數(shù)定義的谆奥,該參數(shù)遵循特定格式:
AGG_SEPARATOR       =  '>' ; # 聚合分隔符
METRIC_SEPARATOR    =  '.' ; # 指標(biāo)分隔符
AGG_NAME            =  <聚合名稱> ;
METRIC              =  <指標(biāo)名稱> ;
PATH                =  <AGG_NAME> [ <AGG_SEPARATOR>, <AGG_NAME> ]* [ <METRIC_SEPARATOR>, <METRIC> ] ;

管道聚合沒(méi)有子聚合功能眼坏,但是根據(jù)其類型,可以引用buckets_path中的另一個(gè)管道酸些,從而可以鏈接管道聚合宰译。
平均值聚合
兄弟管道聚合,用于計(jì)算兄弟聚合中指定指標(biāo)的平均值魄懂。指定的指標(biāo)必須是數(shù)字沿侈,并且同級(jí)聚合必須是多桶聚合。

curl -XPOST "localhost:9200/logstash-*/_search?size=0&pretty" -d'
{
   "aggs": {
      "utc_time_agg": {
         "date_histogram" : {
            "field": "utc_time",
            "interval": "day",
            "format": "yyyy-MM-dd"
         },
         "aggs": {
            "sum_bytes": {
               "sum": {
                  "field": "bytes"
               }
            }
          }
      },
      "max_day_bytes": {
         "avg_bucket": {
            "buckets_path": "utc_time_agg>sum_bytes"
         }
      }
   }
}'

常用參數(shù)

  • gap_policy當(dāng)管道聚合遇到不存在的值市栗,有點(diǎn)類似于term等聚合的(missing)時(shí)所采取的策略缀拭,可選擇值為:skip、insert_zeros填帽。skip:此選項(xiàng)將丟失的數(shù)據(jù)視為bucket不存在蛛淋。它將跳過(guò)桶并使用下一個(gè)可用值繼續(xù)計(jì)算。insert_zeros:默認(rèn)使用0代替盲赊。
  • format用于格式化聚合桶的輸出。
    桶腳本聚合
    父管道聚合敷扫。
curl -XPOST "localhost:9200/logstash-*/_search?size=0&pretty" -d'
{
   "aggs": {
      "utc_time_agg": {
         "date_histogram" : {
            "field": "utc_time",
            "interval": "day",
            "format": "yyyy-MM-dd"
         },
         "aggs": {
            "sum_bytes": {
               "sum": {
                  "field": "bytes"
               }
            },
            "jpg_aggs": {
               "filter": {
                  "term": {
                     "extension.keyword": "jpg"
                  }
               },
               "aggs": {
                  "jpg_bytes": {
                     "sum": {
                        "field": "bytes"
                     }
                  }
               }
            },
            "jpg_percentage": {
               "bucket_script": {
                  "buckets_path": {
                     "jpgBytes": "jpg_aggs>jpg_bytes",
                     "totalBytes": "sum_bytes"
                  },
                  "script": "params.jpgBytes/params.totalBytes*100"
               }
            }
         }
      }
   }
}'

分桶選擇聚合

curl -XPOST "localhost:9200/logstash-*/_search?size=0&pretty" -d'
{
   "aggs": {
      "utc_time_agg": {
         "date_histogram" : {
            "field": "utc_time",
            "interval": "day",
            "format": "yyyy-MM-dd"
         },
         "aggs": {
            "sum_bytes": {
               "sum": {
                  "field": "bytes"
               }
            },
            "bytes_bucket_filter": {
               "bucket_selector": {
                  "buckets_path": {
                     "totalBytes": "sum_bytes"
                  },
                  "script": "params.totalBytes>3650000"
               }
            }
         }
      }
   }
}'
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哀蘑,一起剝皮案震驚了整個(gè)濱河市诚卸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绘迁,老刑警劉巖合溺,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異缀台,居然都是意外死亡棠赛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門膛腐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)睛约,“玉大人,你說(shuō)我怎么就攤上這事哲身”缋裕” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵勘天,是天一觀的道長(zhǎng)怔揩。 經(jīng)常有香客問(wèn)我怔锌,道長(zhǎng)剔蹋,這世上最難降的妖魔是什么万俗? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任宽涌,我火速辦了婚禮糊肠,結(jié)果婚禮上可训,老公的妹妹穿的比我還像新娘绘梦。我一直安慰自己熊咽,他們只是感情好砰苍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布潦匈。 她就那樣靜靜地躺著,像睡著了一般赚导。 火紅的嫁衣襯著肌膚如雪茬缩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天吼旧,我揣著相機(jī)與錄音凰锡,去河邊找鬼。 笑死圈暗,一個(gè)胖子當(dāng)著我的面吹牛掂为,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播员串,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼勇哗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了寸齐?” 一聲冷哼從身側(cè)響起欲诺,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抄谐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后扰法,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛹含,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年塞颁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浦箱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祠锣,死狀恐怖酷窥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锤岸,我是刑警寧澤竖幔,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站是偷,受9級(jí)特大地震影響拳氢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛋铆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一馋评、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刺啦,春花似錦留特、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至糊渊,卻和暖如春右核,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渺绒。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工贺喝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宗兼。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓躏鱼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親殷绍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子染苛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容