Elasticsearch 參考指南(聚合介紹)

聚合介紹

聚合框架幫助提供基於搜索查詢的聚合數據,它基於稱爲聚合的簡單構建塊,能夠進行組合以構建複雜的數據摘要。緩存

聚合能夠看做是在一組文檔上構建分析信息的工做單元,執行的上下文定義了這個文檔集是什麼(例如,頂級聚合在搜索請求的已執行的查詢/過濾器的上下文中執行)。框架

有許多不一樣類型的聚合,每一個聚合都有本身的目的和輸出,爲了更好地理解這些類型,一般更容易將它們分爲四個主要類別:插件

  • 構建桶的聚合系列,其中每一個桶與鍵和文檔標準相關聯,在執行聚合時,將對上下文中每一個文檔評估全部桶標準,當一個標準匹配時,文檔被認爲是「落入」相關的桶中,在聚合過程結束時,咱們將獲得一個桶列表 — 每一個桶都有一組「屬於」它的文檔。

指標

  • 對一組文檔進行跟蹤和計算指標的聚合。

矩陣

  • 基於從請求的文檔字段中提取的值在多個字段上操做並生成矩陣結果的聚合系列,與指標和桶聚合不一樣,此聚合系列還不支持腳本。

管道

  • 聚合其餘聚合的輸出及其相關指標的聚合。

接下來是有趣的部分,因爲每一個桶都有效地定義了一個文檔集(屬於桶的全部文檔),所以能夠在桶級別上關聯聚合,這些聚合將在桶上下文中執行,這就是聚合的真正威力所在:聚合能夠嵌套!code

桶聚合能夠有子聚合(桶或指標),子聚合將被用於它們的父聚合生成的桶的計算,嵌套聚合的級別/深度沒有硬性限制(能夠將聚合嵌套在「父」聚合下,後者自己是另外一個更高級別聚合的子聚合)。
聚合在 double表示的數據上操做,所以,當在絕對值大於 2^53的長度上運行時,結果多是近似的。

構建聚合

下面的片斷捕獲了聚合的基本結構:對象

"aggregations" : {
    "<aggregation_name>" : {
        "<aggregation_type>" : {
            <aggregation_body>
        }
        [,"meta" : {  [<meta_data_body>] } ]?
        [,"aggregations" : { [<sub_aggregation>]+ } ]?
    }
    [,"<aggregation_name_2>" : { ... } ]*
}

JSON中的aggregations對象(也可使用鍵aggs)保存要計算的聚合,每一個聚合都與用戶定義的邏輯名稱相關聯(例如,若是聚合計算平均價格,那麼將其命名爲avg_price是有意義的),這些邏輯名稱還將用於唯一地標識響應中的聚合。每一個聚合都有一個特定的類型(在上面的代碼片斷中的<aggregation_type>),一般是命名聚合body中的第一個鍵。每種聚合類型都定義了本身的body,具體取決於聚合的性質(例如,特定字段上的avg聚合將定義計算平均值的字段)。在聚合類型定義的同一級別上,能夠選擇定義一組額外的聚合,但只有在你定義的聚合具備桶的性質時,這纔有意義。在這個場景中,你在桶聚合級別上定義的子聚合將用於計算由桶聚合構建的全部桶,例如,若是你在range聚合下定義了一組聚合,那麼子聚合將用於你定義的範圍桶計算。索引

值來源

一些聚合處理從聚合文檔中提取的值,一般,值將從使用聚合的field鍵設置的特定文檔字段中提取,還能夠定義一個script來生成值(每一個文檔)。ip

在爲聚合配置fieldscript設置時,腳本將被視爲value script,普通腳本在文檔級別進行評估(即腳本能夠訪問與文檔相關的全部數據),而值腳本在級別進行評估,在這種模式下,從配置的fieldscript中提取的值被用於在這些值上應用「轉換」。文檔

在使用腳本時,還能夠定義 langparams設置,前者定義了使用的腳本語言(假設適當的語言在Elasticsearch中可用,默認狀況下或做爲插件使用),後者支持將腳本中的全部「動態」表達式定義爲參數,從而使腳本在調用之間保持自身的靜態(這將確保在Elasticsearch中使用緩存的已編譯腳本)。

Elasticsearch使用映射中的字段類型來計算如何運行聚合並格式化響應,然而,在兩種狀況下,Elasticsearch沒法計算出這些信息:未映射字段(例如在跨多個索引的搜索請求中,其中只有一些具備字段映射)和純腳本。對於這些狀況,可使用value_type選項給Elasticsearch一個提示,它接受如下值:stringlong(適用於全部整數類型)、double(適用於全部小數類型,如floatscaled_float)、dateipbooleanstring

相關文章
相關標籤/搜索