一:聚合分析簡(jiǎn)介
對(duì)于ES聚合请毛,相當(dāng)與數(shù)據(jù)庫(kù)中的group by 語(yǔ)句,把ES中符合的數(shù)據(jù)給聚合并返回給客戶端丑掺。
ES中获印,聚合語(yǔ)句的查詢格式為:
{
"aggs": {
"agg_name": {<!--聚合名稱-->
"agg_type": {<!---聚合類型-->
<!--具體聚合body-->
}
}
}
}
二:聚合分析分類
ES當(dāng)中的聚合分析主要分為指標(biāo)(metric)聚合和桶(bucketing)聚合。
1.指標(biāo)聚合
指標(biāo)聚合(也叫度量聚合)街州,簡(jiǎn)單點(diǎn)來(lái)說(shuō)就是對(duì)數(shù)據(jù)集中的數(shù)據(jù)進(jìn)行相應(yīng)的指標(biāo)計(jì)算之后兼丰,得出聚合結(jié)果,如求最大值唆缴、最小值鳍征、平均值等。
其一般的查詢格式為:
{
"size": 0,
"aggs": {
"max_agg": {
"max": {<!--指標(biāo)關(guān)鍵詞-->
"field": "score"<!--按照某個(gè)字段進(jìn)行聚合-->
}
}
}
}
PS:聚合查詢中面徽,size可以設(shè)置為0艳丛,表示不返回ES中的文檔,只返回ES聚合之后的數(shù)據(jù)趟紊,提高查詢速度氮双,當(dāng)然如果你需要這些文檔的話,也可以按照實(shí)際情況進(jìn)行設(shè)置霎匈。
指標(biāo)聚合的分類大致如下:
- max min sum avg
- 文檔計(jì)數(shù) count
- Value count 統(tǒng)計(jì)某字段有值的文檔數(shù)
- cardinality 值去重計(jì)數(shù)
- stats 統(tǒng)計(jì) count max min avg sum 5個(gè)值
- Extended stats
- Percentiles 占比百分位對(duì)應(yīng)的值統(tǒng)計(jì)
- Percentiles rank 統(tǒng)計(jì)值小于等于指定值的文檔占比
- Geo Bounds aggregation 求文檔集中的地理位置坐標(biāo)點(diǎn)的范圍
- Geo Centroid aggregation 求地理位置中心點(diǎn)坐標(biāo)值
大家具體情況具體使用吧戴差!
2.桶聚合(bucket)
桶聚合,就是把符合聚合條件數(shù)據(jù)放在一個(gè)分組(桶)里面铛嘱,寧外暖释,桶聚合還將計(jì)算落入某個(gè)桶里面的文檔數(shù)量(count)
舉個(gè)例子:按照某個(gè)字段進(jìn)行聚合袭厂,比如color字段有red、yellow球匕、black等纹磺,按照顏色進(jìn)行聚合,查詢DSL語(yǔ)句為:
{
"size": 0,
"aggs": {
"term_agg": {
"terms": {<!--指標(biāo)關(guān)鍵詞-->
"field": "color"<!--按照某個(gè)字段進(jìn)行聚合-->
}
}
}
}
返回結(jié)果為:
...
{
...
"bucket":[
{"key":"red",
"doc_count":123}
...
]
}
key為聚合的桶的名稱亮曹,doc_count就是聚合的數(shù)量橄杨,有一個(gè)比較重要的地方,就是在做聚合分析的時(shí)候乾忱,該字段的mapping需要設(shè)置為不可分詞的,不然聚合的結(jié)果可能不是你想的那樣讥珍。
聚合操作历极,還是比較復(fù)雜的窄瘟,有時(shí)候要按照嵌套進(jìn)行聚合才能得出你想要的答案,下面貼出來(lái)一些常用的聚合:
- Terms Aggregation 根據(jù)字段值項(xiàng)分組聚合
- filter Aggregation 對(duì)滿足過(guò)濾查詢的文檔進(jìn)行聚合計(jì)算
- Filters Aggregation 多個(gè)過(guò)濾組聚合計(jì)算
- Range Aggregation 范圍分組聚合
- Date Range Aggregation 時(shí)間范圍分組聚合
- Date Histogram Aggregation 時(shí)間直方圖(柱狀)聚合
- Missing Aggregation 缺失值的桶聚合
- Geo Distance Aggregation 地理距離分區(qū)聚合
補(bǔ)充一下趟卸,還有矩陣聚合蹄葱,這個(gè)可以聚合出條件并集的這種情況(adjacency_matrix),
比如說(shuō) A锄列、B图云、C 想聚合A、B邻邮、C竣况、A&B、A&C筒严、B&C就可以用矩陣聚合
三:嵌套聚合
在實(shí)際情況中丹泉,你可能想把符合某一條件的數(shù)據(jù)聚合到一個(gè)桶里面,然后在這個(gè)桶里面進(jìn)行各項(xiàng)指標(biāo)的計(jì)算鸭蛙,這時(shí)候應(yīng)該怎么做呢摹恨?嵌套聚合。
比如下面的DSL語(yǔ)句:
{
"size": 0,
"aggs": {
"term_agg": {
"terms": {<!--指標(biāo)關(guān)鍵詞-->
"field": "color"<!--按照某個(gè)字段進(jìn)行聚合-->
}
}娶视,
“aggs”:{
"avg_price"{
"avg":{<!--指標(biāo)關(guān)鍵詞-->
"field":"price"}
}
}
}
}
表示晒哄,按照顏色聚合到桶內(nèi)后,計(jì)算每個(gè)顏色下的平均價(jià)格肪获。
復(fù)雜的嵌套查詢還有很多寝凌,比如說(shuō)上面的按照平均值聚合后升序排列該怎么做?實(shí)際情況也有很多復(fù)雜的聚合查詢孝赫,具體情況具體討論吧较木。
這應(yīng)該算我隔了好幾年來(lái)第一次寫(xiě)博客吧,寫(xiě)得不好請(qǐng)見(jiàn)諒寒锚,自己也在學(xué)習(xí)上升的階段劫映,所以也想通過(guò)寫(xiě)博客來(lái)鞏固鞏固违孝,不然容易忘記知識(shí),希望自己能堅(jiān)持下去泳赋!