基本概念
桶
簡(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"
}
}
}
}
}
}'