Elastic Search 聚合筆記

ElasticSearch的聚合(Aggregations)引入了兩個概念: html

  1. 桶(Buckets):    知足特定條件的文檔的集合
  2. 指標(Metrics):    對桶內的文檔進行統計計算

每一個聚合都是多個桶指標的組合。和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具備以下優點:

  1. 提供很多高級分組方式,如直方圖,範圍,過濾等
  2. 支持多級聚合,很是容易構建相似透視圖的數據。
  3. 支持多種管道聚合

聚合和bucket的層級關係:

  1. 聚合能夠放多個bucket,
  2. bucket下也能夠掛聚合

這樣,當使用兩個指標分組的時候,有兩種組合方式,

  1. 一個聚合,兩個指標
  2. 兩個指標組合成一個多級聚合

這兩個的行爲是不同的,當聚合下放多個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返回值,如rangefilters遵循此規則。

請求:

"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}      }   }}

相關文章
相關標籤/搜索