從本篇将開始進入ES系列的聚合部分(Aggregations)。
本篇重點介紹Elasticsearch Metric Aggregations(度量聚合)。
Metric聚合,主要針對數值類型的字段,類似于關系型資料庫中的sum、avg、max、min等聚合類型。
本例基于如下索引進行試驗:
對應的SQL表結構如下:
平均值聚合。
注:max,sum,min等使用與avg類似,故不重複介紹。
對字段grade取平均值。
對應的java示例如下:
其中代碼@1:missing(0)表示如果文檔中沒有取平均值的字段時,則使用該值進行計算,本例中使用0參與計算。
其傳回結果如下:
權重平均聚合,其算法,∑(value * weight) / ∑(weight)。
權重平均(weghted_avg)支援的參數清單:
value
提供值的字段或腳本的配置。例如定義計算哪個字段的平均值,該值支援如下子參數:
field
用來定義平均值的字段名稱。
missing
用來定義如果比對到的文檔沒有avg字段,使用該值來參與計算。
weight
用來定義權重的對象,其可選屬性如下:
定義權重來源的字段。
如果文檔缺失權重來源字段,以該值來代表該文檔的權重值。
format
數值類型格式化。
value_type
用來指定value的類型,例如ValueType.DATE、ValueType.IP等。
示例如下:
從文檔中抽取屬性為weight的字段的值來當權重值。
其JAVA示例如下:
基數聚合,先distinct,再聚合,類似關系型資料庫(count(distinct))。
對應的JAVA示例如下:
傳回結果如下:
上述實作與SQL:SELECT COUNT(DISTINCT buyerId) from es_order_tmp where sellerId=24; 效果類似,表示購買了商家id為24的買家個數。
其核心參數如下:
precision_threshold
精确度控制。在此計數之下,期望計數接近準确。在這個值之上,計數可能會變得更加模糊(不準确)。支援的最大值是40000,超過此值的門檻值與40000的門檻值具有相同的效果。預設值是3000。
上述示例中傳回的11是精确值,如果改寫成下面的代碼,結果将變的不準确:
Pre-computed hashes
一個比較好的實踐是需要對字元串類型的字段進行基數聚合的話,可以提前索引該字元串的hash值,通過對hash值的聚合,提高效率。
Missing Value
missing參數定義了應該如何處理缺少值的文檔。預設情況下,它們将被忽略,但也可以将它們視為具有一個值,通過missing value來設定。
中位絕對偏差聚合。由于這部分内容與統計學關系密切,但這并不是我的特長,故對該統計的含義做深入解讀,在實際場景中,我們隻需要知道ES提供了中位數偏差統計的功能,如果有這方面的需求,我們知道如何使用ES的中位數統計即可。
官方場景:
假設我們收集了商品評價資料(1星到5星之間的數值)。在實際使用過程中通常會使用平均值來展示商品的整體評價等級。中位絕對偏差聚合可以幫助我們了解評審之間的差異有多大。
在這個例子中,我們有一個平均評級為3星的産品。讓我們看看它的評級的絕對偏差中值,以确定它們的變化有多大。按照我的了解,中位絕對偏差聚合 ,聚合的資料來源于(原始資料 - 所有原始數值的平均值 的絕對值進行聚合)。
例如評論原始資料如下:
1、2、5、5、4、3、5、5、5、5
其平均值:4
那中位數絕對偏內插補點聚合的資料為:
3、2、1、1、0、1、1、1、1、1
其Restfull示例如下:
該聚合包含兩部分。
代碼@1:針對字段rating使用AVG進行聚合(平均聚合,求出中位數)
代碼@2:針對字段rating進行中位數絕對偏差聚合。
備注:在es high rest api中未封裝(median absolute deviation aggregation)聚合。
ES 關于 Metric聚合就介紹到這裡了,接下來将重點分析Es Buket聚合。
https://mp.weixin.qq.com/s/zYPM2XRt1jYVsrtahMjTlg