天天看點

ES度量聚合(ElasticSearch Metric Aggregations)

從本篇将開始進入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