ElasticSearch的聚合(Aggregations)引入了兩個概念: html
每一個聚合都是多個桶和指標的組合。和sql的聚合語法對比: 算法
SELECT COUNT(color) FROM table_xxx GROUP BY color sql
桶在概念上相似於 SQL 的分組(GROUP BY),而指標則相似於 COUNT() 、 SUM() 、 MAX() 等統計方法。 數據庫
典型示例: 數組
一個ES聚合的請求示例以下: elasticsearch
{
"size": 0,
"aggs": {
"最大費用": {
"max": { "field": "費用" }
}
}
} ide
關鍵字"aggs"標誌了它是一個聚合請求,裏面的請求參數爲: sqlserver
"最大費用": { "max": { "field": "費用" } } ui
主要包含標題,聚合類型(關鍵字),聚合參數三個部分。 spa
返回值爲:
{
"aggregations": {
"最大費用": {
"value": 2260.0
}
}
}
返回值隨着不一樣的請求值會呈現不一樣的格式,具體規則能夠看下面介紹。
指標(Metrics):
指標用來對查詢結果進行統計運算,除了計數外,大部分針對數字類型屬性進行統計。
"aggs": {
"最大費用": { "max": { "field": "費用" } }
}
典型的統計算法有:
ES也支持一些高級統計指標,例如加權平均值,範圍百分比等,具體可參看其官方文檔。
一個聚合請求下能夠下發多個指標:
{
"size": 0,
"aggs": {
"最大費用": { "max": { "field": "費用" } },
"費用合計": { "sum": { "field": "費用" } }
}
}
桶(Buckets):
桶用於對數據進行分組,相似於sqlserver的group,傳統的分組請求在es中對應的語法爲:
"aggs": {
"性別": {
"terms": { "field": "性別" }
}
}
和傳統的關係型數據庫分組相比,ES具備以下優點:
聚合和bucket的層級關係:
這樣,當使用兩個指標分組的時候,有兩種組合方式,
這兩個的行爲是不同的,當聚合下放多個bucket的時候,是從兩個維度分別統計,並union展現:後面的則是在第一個指標每一個分組中就行二次分組。
簡單的講,一個是a+b, 一個是a*b
返回結果格式:
規則1: 當只返回一個結果的時候,會做爲屬性返回,metrics的返回值基本上遵循此規則。
查詢
"aggs": {
"最大費用": { "max": { "field": "費用" } },
"費用合計": { "sum": { "field": "費用" } }
}
返回結果:
"aggregations": {
"最大費用": { "value": 2260.0 },
"費用合計": { "value": 158704.37085723877 }
}
有的bucket也只返回一個結果,例如filter bucket。
規則2: 結果分組名稱不可預知的時候,會做爲名爲buckets的數組返回,大部分的bucket返回結果知足此屬性。
請求:
"aggs": {
"性別": { "terms": { "field": "性別" }
}
}
返回結果:
"aggregations": {
"性別": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{ "key": "女", "doc_count": 289 },
{ "key": "男", "doc_count": 208 }
]
}
}
規則3: 結果分組是可預知的多值是,會做爲名爲buckets的對象返回,部分bucket返回值,如range,filters遵循此規則。
請求:
"aggs": {
"費用級別": {
"range": {
"field": "費用",
"keyed": true,
"ranges": [
{ "key": "便宜", "to": 100 },
{ "key": "通常", "from": 100, "to": 300 },
{ "key": "貴", "from": 300 }
]
}
}
}
返回結果:
"aggregations": {
"費用級別": {
"buckets": {
"便宜": { "to": 100.0, "doc_count": 20 },
"通常": { "from": 100.0, "to": 300.0, "doc_count": 385 },
"貴": { "from": 300.0, "doc_count": 92} } }}