aggregation 詳解3(bucket aggregation)


概述

桶分聚合不進行權值的計算,他們對文檔根據聚合請求中提供的判斷條件(比如:{"from":0,  "to":100})來進行分組(桶分)。

桶分聚合還會額外返回每一個桶內文檔的個數。

桶分聚合可以包含子聚合——sub-aggregations(權值聚合不能包含子聚合,可以作為子聚合),子聚合操作將會應用到由父(parent)聚合產生的每一個桶上。

桶分聚合根據聚合條件,可以只定義輸出一個桶;也可以輸出多個;還可以在根據聚合條件動態確定桶個數(比如:terms aggregation)。

Histogram Aggregation(multi-bucket)

直方圖聚合——基於文檔中的某個【數值類型】字段,通過計算來動態的分桶。

一個文檔屬於某個桶,計算過程大致如下:

rem = value % interval
if (rem < 0) {
    rem += interval
}
bucket_key = value - rem

配置參數

  • field:字段,必須為數值類型
  • interval:分桶間距
  • min_doc_count:最少文檔數桶過濾,只有不少於這么多文檔的桶才會返回
  • extended_bounds:范圍擴展
  • order:對桶排序,如果 histogram 聚合有一個權值聚合類型的"直接"子聚合,那么排序可以使用子聚合中的結果
  • offset:桶邊界位移,默認從0開始
  • keyed:hash結構返回,默認以數組形式返回每一個桶
  • missing:配置缺省默認值
{
    "aggs" : {
        "prices" : {
            "histogram" : {
                "field" : "price",
                "interval" : 50,
                "min_doc_count" : 1,
                "extended_bounds" : {
                    "min" : 0,
                    "max" : 500
                },
                "order" : { "_count" : "desc" },
                "keyed":true,
                "missing":0
            }
        }
    }
}

Data Histogram Aggregation(multi-bucket)

日期直方圖聚合——基於日期類型,以【日期間隔】來桶分聚合。

可用的時間間隔類型為:year、quarter、month、week、day、hour、minute、second,其中,除了year、quarter 和 month,其余可用小數形式。

配置參數

  • field:
  • interval:
  • format:定義日期的格式,配置后會返回一個 key_as_string 的字符串類型日期(默認只有key)
  • time_zone:定義時區,用作時間值的調整
  • offset:
  • missing:
{
    "aggs" : {
        "articles_over_time" : {
            "date_histogram" : {
                "field" : "date",
                "interval" : "month",
                "format" : "yyyy-MM-dd",
                "time_zone": "+08:00"
            }
        }
    }
}

Range Aggregation(multi-bucket)

范圍聚合——基於某個值(可以是 field 或 script),以【字段范圍】來桶分聚合。

范圍聚合包括 from 值,不包括 to 值(區間前閉后開)。

配置參數

  • ranges:配置區間,數組,每一個元素是一個區間。例如:[{from:0}, {from:50, to:100}, {to:200}]
  • keyed:以一個關聯的唯一字符串作為鍵,以 HASH 形式返回,而不是默認的數組
  • script:利用 script 執行結果替代普通的 field 值進行聚合。script可以用file給出,還可以對其它 field 進行求值計算。
{
    "aggs" : {
        "price_ranges" : {
            "range" : {
                "field" : "price",
                "ranges" : [                       //包含 3 個桶
                    { "to" : 50 },
                    { "from" : 50, "to" : 100 },
                    { "from" : 100 }
                ],
                "keyed" : true
            }
        }
    }
}

Date Range Aggregation(multi-bucket)

日期范圍聚合——基於日期類型的值,以【日期范圍】來桶分聚合。

日期范圍可以用各種 Date Math 表達式。

同樣的,包括 from 的值,不包括 to 的值。

配置參數

  • format:定義日期格式,配置后會返回一個 [to/from]_as_string 的字符串類型日期,默認是 to/from 的數值表示
{
    "aggs": {
        "range": {
            "date_range": {
                "field": "date",
                "format": "MM-yyy",               
                "ranges": [                            //包含 3 個桶
                    { "to": "now-10M/M" }, 
                    { "from": "now-10M/M" },
                    {"from":"1970-1-1", "to":"2000-1-1"}
                ]
            }
        }
    }
}

Terms Aggregation(multi-bucket)

詞元聚合——基於某個field,該 field 內的每一個【唯一詞元】為一個桶,並計算每個桶內文檔個數。

默認返回順序是按照文檔個數多少排序。

當不返回所有 buckets 的情況,文檔個數可能不准確。

配置參數

  • size:size用來定義需要返回多個 buckets(防止太多),默認會全部返回。(注意,如果只返回部分buckets,統計的文檔個數不一定准確(每個分片各自的top size個)。size 越大,count 會越精確。)
  • order:排序方式
  • min_doc_count:只返回文檔個數不小於該值的 buckets
  • script:用基本來生成詞元
  • include:包含過濾
  • exclude:排除過濾
  • execution_hint:
  • collect_mode:
  • missing:
{
    "aggs" : {
        "genders" : {
            "terms" : { 
              "field" : "gender",
              "size" : 5,
              "order" : { "_count" : "asc" },
              "min_doc_count": 10,
              "include" : ".*sport.*",
              "exclude" : "water_.*",
              "missing": "N/A"
            }
        }
    }
}

Filters Aggregation(multi-bucket)

多過濾聚合——基於多個過濾條件,來對當前文檔進行【過濾】的聚合,每個過濾都包含所有滿足它的文檔(多個bucket中可能重復)。

配置參數

  • filters: 配置過濾條件,支持 HASH 或 數組格式
  • other_bucket: 是否計算不滿足任何匹配條件的文檔
  • other_bucket_key: 作為不匹配所有過濾條件的文檔的 bucket 名稱
{
  "aggs" : {
    "messages" : {
      "filters" : {
        "other_bucket_key": "other_messages",                //不在過濾條件范圍內的文檔都歸屬於 other_messages 桶
        "filters" : {                                        //過濾條件
          "errors" :   { "term" : { "body" : "error"   }},   
          "warnings" : { "term" : { "body" : "warning" }}
        }
      },
      "aggs" : {
        "monthly" : {
          "histogram" : {
            "field" : "timestamp",
            "interval" : "1M"
          }
        }
      }
    }
  }
}

Filter Aggregation(single-bucket)

過濾聚合——基於一個條件,來對當前的文檔進行過濾的聚合。

{
    "aggs" : {
        "red_products" : {
            "filter" : { "term": { "color": "red" } },
            "aggs" : {
                "avg_price" : { "avg" : { "field" : "price" } }
            }
        }
    }
}

IPv4 Range Aggregation(multi-bucket)

IP4聚合——基於一個 IPv4 字段,對文檔進行【IPv4范圍】的桶分聚合。

和 Range Aggregation 類似,只是應用字段必須是 IPv4 數據類型。

{
    "aggs" : {
        "ip_ranges" : {
            "ip_range" : {
                "field" : "ip",
                "ranges" : [                                //包含 3 個桶,各個桶之間可能有文檔重復
                    { "to" : "10.0.0.5" },
                    { "from" : "10.0.0.5" },
                    { "from":"1.1.1.1", "to" : "10.0.0.5" },
                ]
            }
        }
    }
}

Nested Aggregation(single-bucket)

嵌套類型聚合——基於嵌套(nested)數據類型,把該【嵌套類型的信息】聚合到單個桶里,然后就可以對嵌套類型做進一步的聚合操作。

// resellers 是一個嵌套類型
{
    ...
    "product" : {
        "properties" : {
            "resellers" : { 
                "type" : "nested",
                "properties" : {
                    "name" : { "type" : "string" },
                    "price" : { "type" : "double" }
                }
            }
        }
    }
}
// 對 nested 對象里面的信息做其它聚合操作
{
    "query" : {
        "match" : { "name" : "led tv" }
    },
    "aggs" : {
        "resellers" : {
            "nested" : {                           //"嵌套類型聚合"把所有嵌套信息都包含在單一的桶里,以供進一步處理
                "path" : "resellers"
            },
            "aggs" : {
                "min_price" : { "min" : { "field" : "resellers.price" } }   //對嵌套類型聚合輸出的桶做進一步處理,這里是計算其 price 的 average
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM