elasticsearch--聚合中桶(Buckets)和指標(Metrics)的概念
寫在前面的話:讀書破萬卷,編碼如有神
--------------------------------------------------------------------
主要內容包括:
- 聚合的兩個核心概念:桶(bucket)和指標(metric)
- 桶和指標的深入理解
- 示例說明
---------------------------------------------------------------------
1、聚合的兩個核心概念
在Elasticsearch的聚合中需要掌握兩個核心的概念:桶(bucket)、
桶(bucket): 滿足特定條件的文檔的集合
指標(metric): 對桶內的文檔進行聚合分析的操作
(ps:每個聚合都是一個或者多個桶和零個或者多個指標的組合。)
翻譯成粗略的SQL語句來解釋的話:
SELECT COUNT(color) ---> 相當於指標
FROM table
GROUP BY color --->2 相當於桶
桶在概念上類似於SQL的分組(GROUP BY),而指標則類似於COUNT()、SUM()、MAX()等統計方法。
---------------------------------------------------------------------
2、桶和指標的深入理解
(1)桶
a、簡單來說桶就是滿足特定條件的文檔的集合。
b、當聚合開始被執行,每個文檔裏面的值通過計算來決定符合哪個桶的條件,如果匹配到,文檔將放入相應的桶並接著開始聚合操作。
c、桶也可以被嵌套在其他桶裏面。
(2)指標
a、桶能讓我們劃分文檔到有意義的集合,但是最終我們需要的是對這些桶內的文檔進行一些指標的計算。分桶是一種達到目的地的手段:它提供了一種給文檔分組的方法來讓我們可以計算感興趣的指標。
b、大多數指標是簡單的數學運算(如:最小值、平均值、最大值、匯總),這些是通過文檔的值來計算的。
(3)桶和指標的組合
聚合是由桶和指標組成的。聚合可能只有一個桶,可能只有一個指標,或者可能兩個都有。也有可能一些桶嵌套在其他桶裏面。
---------------------------------------------------------------------
3、舉例說明
比如有如下的數據:
city name
北京 小李
北京 小王
上海 小張
上海 小麗
上海 小陳
基於city來劃分buckets的話,可以劃分出兩個bucket:一個是北京bucket、一個是上海bucket
北京bucket:包含了2個人,小李、小王
上海bucket:包含了3個人,小張、小麗、小陳
按照某個字段進行bucket劃分,那個字段的值相同的那些數據,就會被劃分到一個bucket中。當我們有了一堆bucket之後,就可以對每個bucket中的數據聚合分析了,比如說計算一個bucket內所有數據的數量 ,或者計算一個bucket內所有數據的平均值、最大值、最小值。
metric : 就是對一個bucket執行的某種聚合分析的操作,比如說求平均值、最大值、最小值 。
上面利用elasticsearch的分組,可以轉化成對應的sql語句如下:
select count(*) from access_log group by user_id
其中:bucket 相當於 group by user_id -->那些user_id相同的數據,就會被劃分到一個bucket中
metric 相當於 count(*) -->對每個user_id bucket中所有的數據計算一個數量
elasticsearch--聚合中桶(Buckets)和指標(Metrics)的概念