ElasticSearch聚合應(yīng)該怎么學(xué)

大家好,我是咔咔 不期速成,日拱一卒

ElasticSearch致力于搜索的同時柠傍,也提供了聚合實(shí)時分析數(shù)據(jù)的功能馋嗜,聚合可以實(shí)現(xiàn)把復(fù)雜的數(shù)據(jù)進(jìn)行一系列計(jì)算后得出我們想要的數(shù)據(jù)齐板。

雖然聚合的功能與搜索完全不同,但使用的數(shù)據(jù)結(jié)構(gòu)是完全相同的葛菇,因此聚合的執(zhí)行速度很快甘磨,也就是說在一次請求中對相同數(shù)據(jù)可以同時進(jìn)行搜索+過濾、分析眯停。

在ElasticSearch中聚合共分為四大類:

  • Bucket Aggregation:分桶類型济舆,一些列滿足特定條件的文檔集合
  • Metric Aggregation:指標(biāo)分析類型,對數(shù)據(jù)進(jìn)行數(shù)學(xué)運(yùn)算莺债,例如求最大滋觉、小值
  • Pipeline Aggregation:管道分析類型,已經(jīng)聚合的結(jié)果進(jìn)行二次聚合
  • Matix Aggregation:矩陣分析類型齐邦,支持對多個字段操作并提供一個結(jié)果矩陣

先從簡開始椎侠,看一下Bucket、Metric這兩種類型侄旬,Bucket實(shí)現(xiàn)的結(jié)果就是MySQL中g(shù)roup關(guān)鍵字的使用肺蔚,Metric則是MySQL中max、min函數(shù)的使用儡羔。

3c49e0d7c54642ab88a89a0cebceedc9.png

一宣羊、Buckert Aggregation

介紹

07dbb59e698d4097b3ff856d97ed3049.png

通過上圖可得知將數(shù)據(jù)分為了三個桶,第一個桶統(tǒng)計(jì)的是身高小于300汰蜘,第二個桶統(tǒng)計(jì)的是身高大于600仇冯,第三個桶統(tǒng)計(jì)的是身高在300到600之間的,在這個案例中就是根據(jù)不同的身高分到不同的桶中族操。

使用聚合分析機(jī)制還可以按照年齡苛坚、地理位置、性別色难、薪資范圍泼舱、訂單增長情況、工作崗位分布等枷莉。只要有一定共同點(diǎn)的數(shù)據(jù)都可使用聚合進(jìn)行歸檔處理涤久。

常見的Bucket分桶策略

  • terms:按照term來分桶卷谈,如果是text類型則會按照分詞后的結(jié)果進(jìn)行分桶
  • range:指定數(shù)值的范圍來設(shè)定分桶規(guī)則
  • data range:指定日期的范圍來設(shè)定分桶規(guī)則
  • histogram:固定的間隔來來設(shè)定分桶規(guī)則
  • data histogram:針對日期的直方圖或柱狀圖

Terms

根據(jù)目的地進(jìn)行分桶

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "destcountry_term":{
      "terms": {
        "field": "DestCountry"
      }
    }
  },
  "profile":"true"
}

從返回結(jié)果中看到根據(jù)目的地將航班信息進(jìn)行了歸類處理掠拳,同時也會發(fā)現(xiàn)在ElasticSearch中如果不手動定義size值都會默認(rèn)只返回10條結(jié)果

"aggregations" : {
    "destcountry_term" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 3187,
      "buckets" : [
        {
          "key" : "IT",
          "doc_count" : 2371
        },
        {
          "key" : "US",
          "doc_count" : 1987
        },
        {
          "key" : "CN",
          "doc_count" : 1096
        },
        {
          "key" : "CA",
          "doc_count" : 944
        },
        {
          "key" : "JP",
          "doc_count" : 774
        },
        {
          "key" : "RU",
          "doc_count" : 739
        },
        {
          "key" : "CH",
          "doc_count" : 691
        },
        {
          "key" : "GB",
          "doc_count" : 449
        },
        {
          "key" : "AU",
          "doc_count" : 416
        },
        {
          "key" : "PL",
          "doc_count" : 405
        }
      ]
    }
  }

Range

想要查詢平均價格在300以下、300~600之間噪裕、大于600的案例

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "avgticketprice_range":{
      "range": {
        "field": "AvgTicketPrice",
        "ranges": [
          {"to":300},
          {"from":300,"to":600},
          {"from":600}
        ]
      }
    }
  }
}

返回結(jié)果如下,可以三條結(jié)果都根據(jù)不同的區(qū)間設(shè)置了key值

"aggregations" : {
    "avgticketprice_range" : {
      "buckets" : [
        {
          "key" : "*-300.0",
          "to" : 300.0,
          "doc_count" : 1816
        },
        {
          "key" : "300.0-600.0",
          "from" : 300.0,
          "to" : 600.0,
          "doc_count" : 4115
        },
        {
          "key" : "600.0-*",
          "from" : 600.0,
          "doc_count" : 7128
        }
      ]
    }
  }

可以通過設(shè)置keyed:true股毫,使每個區(qū)間都返回一個特定的名字

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "avgticketprice_range":{
      "range": {
        "field": "AvgTicketPrice",
        "keyed":"true",
        "ranges": [
          {"to":300},
          {"from":300,"to":600},
          {"from":600}
        ]
      }
    }
  }
}

可以好好的跟上一個案例對比一下區(qū)別

"aggregations" : {
    "avgticketprice_range" : {
      "buckets" : {
        "*-300.0" : {
          "to" : 300.0,
          "doc_count" : 1816
        },
        "300.0-600.0" : {
          "from" : 300.0,
          "to" : 600.0,
          "doc_count" : 4115
        },
        "600.0-*" : {
          "from" : 600.0,
          "doc_count" : 7128
        }
      }
    }
  }

當(dāng)然也可以指定區(qū)間的名字

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "avgticketprice_range":{
      "range": {
        "field": "AvgTicketPrice",
        "keyed":"true",
        "ranges": [
          {"key":"小于300","to":300},
          {"key":"300到600之間","from":300,"to":600},
          {"key":"大于600","from":600}
        ]
      }
    }
  }
}

返回結(jié)果

"aggregations" : {
    "avgticketprice_range" : {
      "buckets" : {
        "小于300" : {
          "to" : 300.0,
          "doc_count" : 1816
        },
        "300到600之間" : {
          "from" : 300.0,
          "to" : 600.0,
          "doc_count" : 4115
        },
        "大于600" : {
          "from" : 600.0,
          "doc_count" : 7128
        }
      }
    }
  }

Data Range

通過指定日期的范圍來設(shè)定分桶規(guī)則膳音,如對timestamp字段按照設(shè)定的時間段來分桶。

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "data_range_timestamp":{
      "date_range":{
        "field":"timestamp",
        "format":"yyyy-MM",
        "ranges":[
          {"from":"2022-01","to":"2022-02"},
          {"from":"2022-02","to":"2022-03"}
        ]
      }
    }
  }
}

返回結(jié)果铃诬,思考一下如果想要設(shè)置固定的key值應(yīng)該怎么設(shè)置呢祭陷?還有要注意的是日期格式yyyy-MM-dd HH:mm:ss

"aggregations" : {
    "data_range_timestamp" : {
      "buckets" : [
        {
          "key" : "2022-01-2022-02",
          "from" : 1.6409952E12,
          "from_as_string" : "2022-01",
          "to" : 1.6436736E12,
          "to_as_string" : "2022-02",
          "doc_count" : 9580
        },
        {
          "key" : "2022-02-2022-03",
          "from" : 1.6436736E12,
          "from_as_string" : "2022-02",
          "to" : 1.6460928E12,
          "to_as_string" : "2022-03",
          "doc_count" : 1837
        }
      ]
    }
  }

Historgram

直方圖,以固定間隔的策略來分割數(shù)據(jù)氧急,如對AvgTicketPrice字段按照100的間隔進(jìn)行分桶

  • interval :每次間隔50
  • min_doc_count :存在的文檔數(shù)最少是0條
  • extended_bounds :此值只有當(dāng)min_doc_count 為0時才具有意義

在實(shí)現(xiàn)時你會發(fā)現(xiàn)extended_bounds不過濾桶颗胡。extended_bounds.min高于從文檔中提取的值毫深,那么文檔仍然會規(guī)定第一個存儲段將是什么(對于extended_bounds.max和最后一個存儲段也是如此)吩坝。為了過濾桶,您應(yīng)該將直方圖聚合嵌套在范圍過濾器聚合中哑蔫,并使用適當(dāng)?shù)膹?到設(shè)置

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "price_histogram":{
      "histogram": {
        "field": "AvgTicketPrice",
        "interval": 50,
        "min_doc_count":"0",
        "extended_bounds":{
          "min":0,
          "max":600
        }
      }
    }
  }
}

返回結(jié)果

"aggregations" : {
    "price_histogram" : {
      "buckets" : [
        {
          "key" : 0.0,
          "doc_count" : 0
        },
        {
          "key" : 50.0,
          "doc_count" : 0
        },
        {
          "key" : 100.0,
          "doc_count" : 380
        },
        {
          "key" : 150.0,
          "doc_count" : 369
        },
        {
          "key" : 200.0,
          "doc_count" : 398
        }
      ]
    }
  }

Data histogram

針對日期的直方圖或者柱狀圖钉寝,是時序數(shù)據(jù)分析中常用的聚合分析類型,如對timestamp字段按照月的間隔進(jìn)行分桶

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "timestamp_data_histogram":{
      "date_histogram": {
        "field": "timestamp",
        "interval": "month",
        "min_doc_count": 0,
        "format": "yyyy-MM-dd",
        "extended_bounds": {
          "min": "2021-10-10",
          "max": "2022-01-19"
        }
      }
    }
  }
}

返回結(jié)果

"aggregations" : {
    "timestamp_data_histogram" : {
      "buckets" : [
        {
          "key_as_string" : "2021-10-01",
          "key" : 1633046400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2021-11-01",
          "key" : 1635724800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2021-12-01",
          "key" : 1638316800000,
          "doc_count" : 1642
        },
        {
          "key_as_string" : "2022-01-01",
          "key" : 1640995200000,
          "doc_count" : 9580
        },
        {
          "key_as_string" : "2022-02-01",
          "key" : 1643673600000,
          "doc_count" : 1837
        }
      ]
    }
  }

二闸迷、嵌套查詢

上文中列舉了五種分桶的實(shí)現(xiàn)嵌纲,在實(shí)際開發(fā)中只是單一的進(jìn)行聚合查詢是非常少的,大多情況下都是會進(jìn)行嵌套操作腥沽。

先根據(jù)機(jī)票進(jìn)行分桶后逮走,再對分桶后的數(shù)據(jù)取總數(shù)、最小值今阳、最大值师溅、平均值、總和

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "price_range":{
      "range": {
        "field": "AvgTicketPrice",
        "ranges": [
          {"to":300},
          {"from":300,"to":600},
          {"from":600}
        ]
      },
      "aggs":{
        "price_status":{
          "stats": {
            "field": "AvgTicketPrice"
          }
        }
      }
    }
  }
}

返回結(jié)果(返回結(jié)果截取顯示了)

"aggregations" : {
    "price_range" : {
      "buckets" : [
        {
          "key" : "*-300.0",
          "to" : 300.0,
          "doc_count" : 1816,
          "price_status" : {
            "count" : 1816,
            "min" : 100.0205307006836,
            "max" : 299.9529113769531,
            "avg" : 212.5348257619379,
            "sum" : 385963.2435836792
          }
        }
      ]
    }
  }

還有更多的操作等待我們?nèi)ネ诰蚨苌啵劝鸦A(chǔ)的搞定墓臭,不期速成,日拱一卒

堅(jiān)持學(xué)習(xí)妖谴、堅(jiān)持寫作窿锉、堅(jiān)持分享是咔咔從業(yè)以來所秉持的信念。愿文章在偌大的互聯(lián)網(wǎng)上能給你帶來一點(diǎn)幫助膝舅,我是咔咔嗡载,下期見。

文章來自公號:咔咔閑談

獲取更多ElasticSearch學(xué)習(xí)資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仍稀,一起剝皮案震驚了整個濱河市洼滚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琳轿,老刑警劉巖判沟,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耿芹,死亡現(xiàn)場離奇詭異,居然都是意外死亡挪哄,警方通過查閱死者的電腦和手機(jī)吧秕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迹炼,“玉大人砸彬,你說我怎么就攤上這事∷谷耄” “怎么了砂碉?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長刻两。 經(jīng)常有香客問我增蹭,道長,這世上最難降的妖魔是什么磅摹? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任滋迈,我火速辦了婚禮,結(jié)果婚禮上户誓,老公的妹妹穿的比我還像新娘饼灿。我一直安慰自己,他們只是感情好帝美,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布碍彭。 她就那樣靜靜地躺著,像睡著了一般悼潭。 火紅的嫁衣襯著肌膚如雪庇忌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天女责,我揣著相機(jī)與錄音漆枚,去河邊找鬼。 笑死抵知,一個胖子當(dāng)著我的面吹牛墙基,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刷喜,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼残制,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了掖疮?” 一聲冷哼從身側(cè)響起初茶,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浊闪,沒想到半個月后恼布,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體螺戳,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年折汞,在試婚紗的時候發(fā)現(xiàn)自己被綠了倔幼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡爽待,死狀恐怖损同,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸟款,我是刑警寧澤膏燃,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站何什,受9級特大地震影響组哩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜富俄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一禁炒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霍比,春花似錦、人聲如沸暴备。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涯捻。三九已至浅妆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間障癌,已是汗流浹背凌外。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涛浙,地道東北人康辑。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像轿亮,于是被迫代替她去往敵國和親疮薇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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

  • 聚合分析簡介 聚合分析:英文為Aggregation我注,是es除搜索功能外提供的針對es數(shù)據(jù)做統(tǒng)計(jì)分析的功能按咒。 功能...
    小波同學(xué)閱讀 4,012評論 0 5
  • 本文主要介紹 Elasticsearch 的聚合功能,介紹什么是 Bucket 和 Metric 聚合但骨,以及如何實(shí)...
    武培軒閱讀 309評論 0 1
  • 前言 掌握ElasticSearch(簡稱ES)的基本API之后励七,可以讓我們實(shí)現(xiàn)對業(yè)務(wù)數(shù)據(jù)精確檢索智袭,若是要進(jìn)一步對...
    moutory閱讀 3,405評論 0 0
  • 什么是聚合分析?聚合分析掠抬,英文為Aggregation补履,是ES除搜索功能外提供的針對ES數(shù)據(jù)做統(tǒng)計(jì)分析的功能。功能...
    M燚閱讀 624評論 0 0
  • 在數(shù)據(jù)庫領(lǐng)域剿另,借助SQL我們可以獲取表中的最大值(Max)箫锤、最小值(Min),還可以對數(shù)據(jù)進(jìn)行分組(Group)雨女。...
    冰河winner閱讀 1,635評論 0 5