聚合介紹
聚合框架幫助提供基於搜索查詢的聚合數據,它基於稱爲聚合的簡單構建塊,可以進行組合以構建複雜的數據摘要。
聚合可以看作是在一組文檔上構建分析信息的工作單元,執行的上下文定義了這個文檔集是什麼(例如,頂級聚合在搜索請求的已執行的查詢/過濾器的上下文中執行)。
有許多不同類型的聚合,每個聚合都有自己的目的和輸出,爲了更好地理解這些類型,通常更容易將它們分爲四個主要類別:
桶
- 構建桶的聚合系列,其中每個桶與鍵和文檔標準相關聯,在執行聚合時,將對上下文中每個文檔評估所有桶標準,當一個標準匹配時,文檔被認爲是“落入”相關的桶中,在聚合過程結束時,我們將得到一個桶列表 — 每個桶都有一組“屬於”它的文檔。
指標
- 對一組文檔進行跟蹤和計算指標的聚合。
矩陣
- 基於從請求的文檔字段中提取的值在多個字段上操作並生成矩陣結果的聚合系列,與指標和桶聚合不同,此聚合系列還不支持腳本。
管道
- 聚合其他聚合的輸出及其相關指標的聚合。
接下來是有趣的部分,由於每個桶都有效地定義了一個文檔集(屬於桶的所有文檔),因此可以在桶級別上關聯聚合,這些聚合將在桶上下文中執行,這就是聚合的真正威力所在:聚合可以嵌套!
桶聚合可以有子聚合(桶或指標),子聚合將被用於它們的父聚合生成的桶的計算,嵌套聚合的級別/深度沒有硬性限制(可以將聚合嵌套在“父”聚合下,後者本身是另一個更高級別聚合的子聚合)。
聚合在雙重表示的數據上操作,因此,當在絕對值大於2^53
的longs上運行時,結果可能是近似的。
構建聚合
下面的片段捕獲了聚合的基本結構:
"aggregations" : {
"<aggregation_name>" : {
"<aggregation_type>" : {
<aggregation_body>
}
[,"meta" : { [<meta_data_body>] } ]?
[,"aggregations" : { [<sub_aggregation>]+ } ]?
}
[,"<aggregation_name_2>" : { ... } ]*
}