ElasticSearch Aggregation
聚合框架有助於基於搜索查詢提供聚合數據。它基於稱為聚合的簡單構建塊,可以進行組合以構建複雜的數據摘要。
聚合可以看作是在一組文檔上建立分析信息的工作單元。執行的上下文定義此文檔集是什麼(例如,頂級聚合在搜索請求的已執行查詢/過濾器的上下文中執行)。有許多不同類型的聚合,每種聚合都有自己的目的和輸出。為了更好地理解這些類型,通常更容易將它們分為四個主要家族:
Metric:在一組文檔上跟蹤和計算指標的聚合。這些值通常是從文檔的欄位中提取的(使用欄位數據),但也可以使用腳本生成。Bucketing:生成存儲桶的一組聚合,其中每個存儲桶都與一個鍵和一個文檔條件相關聯。執行聚合時,將對上下文中的每個文檔評估所有存儲桶條件,並且當條件匹配時,該文檔將被視為「落入」相關存儲桶。到聚合過程結束時,我們將得到一個存儲桶列表-每個存儲桶都有一組「屬於」的文檔。Matrix:操作多個欄位並根據從請求的文檔欄位中提取的值生成矩陣結果的集合。與Metric和Bucketing不同,這個聚合不支持腳本!Pipeline:它聚合其他聚合的輸出及其相關的Metric。由於每個存儲桶有效地定義了一個文檔集(所有文件都屬於該存儲桶),因此可以潛在地在存儲桶級別關聯聚合,並且這些聚合將在該存儲桶的上下文中執行。這就是聚合真正的力量所在:聚合可以嵌套!
存儲桶聚合可以具有子聚合(存儲桶或指標)。子聚合將針對其父聚合生成的存儲桶進行計算。嵌套聚合的級別/深度沒有硬性限制(可以將一個聚合嵌套在「父」聚合下,該「父」聚合本身是另一種更高級別的聚合的子聚合)。聚合作用於double數據的表示形式。因此,當運行絕對值大於的多頭時,結果可能是近似的2^53。
度量(Metric)聚合
數值指標聚合是一種特殊類型的指標聚合,可輸出數值。一些聚合輸出單個數值度量(例如avg)並被稱為single-value numeric metrics aggregation,其他聚合則生成多個度量(例如stats)並被稱為multi-value numeric metrics aggregation。當這些值充當某些存儲桶聚合的直接子聚合(某些存儲桶聚合使您可以基於每個存儲桶中的數字度量對返回的存儲桶進行排序)時,單值和多值數字度量聚合之間的區別將發揮作用。
度量(Metric)聚合在ElasticSearch官方文檔中有很中聚合,這裡我只列舉我們最常用的幾個聚合示例。
avg 聚合
計算的平均個從聚集的文檔中提取數值。這些值可以從文檔中的特定數字欄位中提取,也可以由提供的腳本生成。
這裡我們用一個實例來進行說明,得到一個班級的學生分數平均分數。
DSL語句示例:
注: grade 欄位類型必須是整型
當然,如果成績還包含權重(weight)的話,我們可以為其添加權重.權重: 在計算常規平均值時,每個數據點都具有相等的``權重''...它對最終值的貢獻均等。可以理解為權重值越大,就越靠前,加權公式為: ∑(value * weight) / ∑(weight).
DSL語句示例:
max/min 聚合
這裡我們用一個實例來進行說明,得到班級的最高分和最低分。
DSL語句示例:
sum聚合
得到某欄位總和的值。
DSL語句示例>
top 聚合
一個top_hits指標聚合不斷被聚合跟蹤最相關的文檔。該聚合器旨在用作子聚合器,以便可以按存儲分區匯總最匹配的文檔。該top_hits聚合器可以有效地通過某些欄位經由鏟鬥聚合器用於將結果集。一個或多個存儲桶聚合器確定將結果集切成哪些屬性。
選件
from -與您要提取的第一個結果的偏移量。size-每個存儲區返回的最匹配匹配項的最大數量。默認情況下,返回前三個匹配項。sort-熱門匹配項的排序方式。默認情況下,命中按主要查詢的分數排序。這裡我們依舊通過一個示例來進行說明。根據grade(成績)降序取前2條數據,欄位只包含grade(成績)和name(姓名)。
DSL語句示例:
JAVA代碼示例