聚合框架幫助提供基於搜索查詢的聚合數據,它基於稱爲聚合的簡單構建塊,能夠進行組合以構建複雜的數據摘要。緩存
聚合能夠看做是在一組文檔上構建分析信息的工做單元,執行的上下文定義了這個文檔集是什麼(例如,頂級聚合在搜索請求的已執行的查詢/過濾器的上下文中執行)。框架
有許多不一樣類型的聚合,每一個聚合都有本身的目的和輸出,爲了更好地理解這些類型,一般更容易將它們分爲四個主要類別:插件
接下來是有趣的部分,因爲每一個桶都有效地定義了一個文檔集(屬於桶的全部文檔),所以能夠在桶級別上關聯聚合,這些聚合將在桶上下文中執行,這就是聚合的真正威力所在:聚合能夠嵌套!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
在爲聚合配置field
和script
設置時,腳本將被視爲value script
,普通腳本在文檔級別進行評估(即腳本能夠訪問與文檔相關的全部數據),而值腳本在值級別進行評估,在這種模式下,從配置的field
和script
中提取的值被用於在這些值上應用「轉換」。文檔
在使用腳本時,還能夠定義lang
和params
設置,前者定義了使用的腳本語言(假設適當的語言在Elasticsearch中可用,默認狀況下或做爲插件使用),後者支持將腳本中的全部「動態」表達式定義爲參數,從而使腳本在調用之間保持自身的靜態(這將確保在Elasticsearch中使用緩存的已編譯腳本)。
Elasticsearch使用映射中的字段類型來計算如何運行聚合並格式化響應,然而,在兩種狀況下,Elasticsearch沒法計算出這些信息:未映射字段(例如在跨多個索引的搜索請求中,其中只有一些具備字段映射)和純腳本。對於這些狀況,可使用value_type
選項給Elasticsearch一個提示,它接受如下值:string
、long
(適用於全部整數類型)、double
(適用於全部小數類型,如float
或scaled_float
)、date
、ip
和boolean
。string