Elasticsearch 之聚合分析入門

點擊上方「武培軒」,選擇「設爲星標」html

技術文章第一時間送達!web


本文主要介紹 Elasticsearch 的聚合功能,介紹什麼是 Bucket 和 Metric 聚合,以及如何實現嵌套的聚合。微信

首先來看下聚合(Aggregation):app

什麼是 Aggregation?

首先舉一個生活中的例子,這個是京東的搜索界面,在搜索框中輸入「華爲」進行搜索,就會獲得如上界面,搜索框就是咱們經常使用的搜索功能,而下面這些,好比分類、熱點、操做系統、CPU 類型等是根據 ES 的聚合分析得到的相關結果。elasticsearch

看完上面這個例子,下面來看下聚合的定義:編輯器

ES 除了搜索之外,還提供針對 ES 數據進行統計分析的功能,也就是聚合,它的特色是實時性很是高,全部的計算結果都是即時返回的,而 Hadoop 等大數據系統獲得一個統計結果須要一天的時間,通常都是 T + 1 級別的。ide

經過聚合,咱們會獲得一個數據的概覽,是分析和總結全套的數據,而不是尋找單個文檔,好比海淀區和東城區的客房數量,不一樣價格區間,可預訂的經濟型酒店和商務型酒店的數量,這樣能夠幫助咱們過濾搜索的結果,這樣的優勢是性能高,只須要一條語句,就能夠從 ES 獲得分析結果,無需再客戶端本身去實現分析邏輯。oop

在 ES 的聚合中主要一共分爲四大類:性能

  • Bucket Aggregation:分桶類型,一些列知足特定條件的文檔的集合
  • Metric Aggregation:指標分析類型,一些數學運算,能夠對文檔字段進行統計分析,好比計算最大值、最小值、平均值等
  • Pipeline Aggregation:管道分析類型,對其餘聚合結果進行二次聚合
  • Matrix Aggregation:矩陣分析類型,支持對多個字段的操做並提供一個結果矩陣

在之後的文章會對這些作詳細的講解,本文先來了解下什麼是 Bucket 和 Metric:學習

Bucket 簡單來講至關於 SQL 中的 GROUP,能夠根據條件,把結果分紅一個一個的組,那 Metric 至關於 SQL 中的 COUNT,能夠去執行一系列的統計方法。

接下來看什麼是 Bucket Aggregation:

Bucket Aggregation

Bucket 就是桶的意思,即按照必定的規則將文檔分配到不一樣的桶中,達到分類分析的目的。如上圖所示,左邊有一堆文檔,右邊有三個桶,每一個桶有不一樣的規則,好比第一個桶的規則爲價格小於 3000 的,第二個桶爲價格大於等於 3000 小於 6000 的,最後一個桶的規則爲價格大於 6000 的,而後不一樣的文檔根據不一樣的價格分到不一樣的桶中,那麼咱們就實現了分類。

有了 Bucket 聚合分析機制,咱們就能夠把公司員工以年齡方式進行區分,以地理位置的方式來區分客戶,以男性女性來區分演員等。

根據 Bucket 的分桶策略,常見的 Bucket 聚合分析以下:

  • Terms:直接按照 term 來分桶,若是是 text 類型,則按照分詞後的結果分桶
  • Range:指定數值的範圍來設定分桶規則
  • Date Range:指定日期的範圍來設定分桶規則
  • Histogram:直方圖,以固定間隔的策略來分割數據
  • Date Histogram:針對日期的直方圖或者柱狀圖,是時序數據分析中經常使用的聚合分析類型

下面以 Terms 爲例,讓咱們動手實踐下:

Bucket 聚合分析-Terms

這是一個查看航班目的地的統計信息的例子,經過指定關鍵詞爲 terms,而後指明 term 字段 fieldDestCountry,下面咱們請求下,查看下請求結果:

response

從結果中能夠看到文檔根據目的地分紅了不一樣的桶,每一個桶還包括 doc_count,這樣就能夠很輕鬆知道 ES 存儲的航班信息中,去往意大利、美國、中國等國家分別有多少架航班。

在簡單瞭解了 Bucket 聚合分析後,讓咱們來看下 Metric 聚合分析:

Metric Aggregation

Metric 是基於數據集計算的結果,除了支持在字段上進行計算,一樣也支持在腳本產生的結果之上進行計算。Metric 主要分爲單值分析和多值分析,具體內容以下:

單值分析,只輸出一個分析結果:

  • Min、Max、Avg、Sum
  • Cardinality

其中,Min、Max、Avg、Sum 這些很容易理解,在這裏說一下 Cardinality,它是指不一樣數值的個數,至關於 SQL 中的 distinct。

多值分析,輸出多個分析結果:

  • Stats、Extended Stats
  • Percentiles、Percentile Ranks
  • Top Hits

其中,Stats 是作多樣的數據分析,能夠一次性獲得最大值、最小值、平均值、中值等數據;Extended Stats 是對 Stats 的擴展,包含了更多的統計數據,好比方差、標準差等;PercentilesPercentile Ranks 是百分位數的一個統計;Top Hits 通常用於分桶後獲取桶內最匹配的頂部文檔列表,即詳情數據。

瞭解以後,讓咱們實操起來,緊接着剛纔查看航班目的地的統計信息的例子,若是還想知道機票的均價,最高最低價格,該怎麼作呢?這就須要用到 Metric 了:

Metric 聚合分析

咱們在請求中加入 aggs,其中 avg_price 爲本身定義的名字,這個是爲了方便在之後理解這個字段返回值的含義,而後分別關鍵詞分別選擇 avg、max、min 來完成計算目的地不一樣的航班的機票均價、最高最低價格,這個請求的執行結果以下所示:

response

從結果中能夠看出,飛往意大利的航班一共有 2371 架,其中機票最高價格爲 1195 元,最低價格爲 100 元,平均價格爲 586 元,很快就能夠獲得統計的一些結果。

另外,聚合分析還支持嵌套,那麼讓咱們看下若是實現一個嵌套聚合分析:

嵌套聚合分析

經過這個請求不但能夠獲取到航班目的地的統計信息,還能夠獲得航班抵達時的天氣情況,運行結果以下所示:

response

能夠看出,在抵達意大利的航班中,抵達時的天氣有 424 次爲晴天,417 次爲下雨天等,因此經過嵌套的方式就能夠很快獲得更深層次的數據統計值。

總結

本文對 Elasticsearch 的聚合功能作了初步介紹,也學習 Bucket 和 Metric 聚合分析,在後續文章會對聚合功能作一個更加深刻的講解。

留言討論

下面是我總結的 Elasticsearch 聚合分析的思惟導圖,在公衆號【武培軒】回覆【es】獲取思惟導圖以及源代碼。

Elasticsearch 聚合分析

參考文獻

Elastic Stack從入門到實踐

Elasticsearch核心技術與實戰

https://www.elastic.co/guide/en/elasticsearch/reference/7.1/search-aggregations.html


       
   
爲何阿里巴巴Java開發手冊中強制要求不要在foreach循環裏進行元素的remove和add操做?
爲何阿里巴巴Java開發手冊中強制要求整型包裝類對象值用 equals 方法比較?
爲何阿里巴巴Java開發手冊中不建議在循環體中使用+進行字符串拼接?

本文分享自微信公衆號 - 武培軒(wupeixuan404)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索