elk筆記16--aggs-Metrics Aggregations
- 1 Metrics Aggregations 簡介
- 2 Metrics Aggregations 分類
-
- 2.1 Avg Aggregation
- 2.2 Weighted Avg Aggregation
- 2.3 Max Aggregation
- 2.4 Min Aggregation
- 2.5 Sum Aggregation
- 2.6 Stats Aggregation
- 2.7 Extended Stats Aggregation
- 2.8 Cardinality Aggregation
- 待補充
- 3 注意事項
- 4 說明
本文對聚合中的Metrics類型聚合進行進一步介紹,包括基礎概念、常見aggs案例、注意事項等部分,後續将在此子產品持續補充完善Metrics類型的aggs。
1 Metrics Aggregations 簡介
名額類的聚合,在es中主要用于追蹤和計算一個文檔集的屬性。
在名額聚合家族中,聚合可以對一些名額進行計算,這些名額基于從已有的聚合文檔中提取出來的值,這些值一把是從文檔的字段提取的,當然也可以通過腳本産生。
數值類型的名額聚合是一類特有的名額聚合,它輸出一些數字類型的值。其中一類聚合輸出單個數值名額,被稱為單值數值名額聚合,例如求平均數avg;另外一類輸出多個數值名額,被稱作多隻數值名額聚合。當這些聚合充當某些桶聚合的直接子聚合時(一些桶聚合根據桶中的數值屬性,可以使我們對傳回桶進行排序),單值和多值數字名額聚合之間的差別将發揮作用。
2 Metrics Aggregations 分類
2.1 Avg Aggregation
計算指定字段的平均值
GET kibana_sample_data_ecommerce/_search?size=0
{
"aggs" : {
"avg_taxful_total_price" : {
"avg" : {
"field" : "taxful_total_price"
}
}
}
}
結果:
{
...
"aggregations" : {
"avg_taxful_total_price" : {
"value" : 1052652.38671875
}
}
}
使用腳本擷取指定字段的值:
avg内部的field改為script,source為doc.字段名稱.value
GET kibana_sample_data_ecommerce/_search?size=0
{
"aggs" : {
"avg_taxful_total_price" : {
"avg" : {
"script": {
"source": "doc.taxful_total_price.value"
}
}
}
}
}
2.2 Weighted Avg Aggregation
Weighted Avg 聚合屬于單名額聚合,其作用為計算出帶有權重的平均值,當權重為1的時候就稱為普通的avg聚合了,其計算公式:∑(value * weight) / ∑(weight)
POST /exams/_search
{
"size": 0,
"aggs" : {
"weighted_grade": {
"weighted_avg": {
"value": {
"field": "grade"
},
"weight": {
"field": "weight"
}
}
}
}
}
此處value和weight兩個字段是必選字段,也可以根據需要設定 weighted_avg 的 format 和 value_type 字段;此外value和weight也可以按需設定missing字段。
2.3 Max Aggregation
同 avg
2.4 Min Aggregation
同avg
2.5 Sum Aggregation
同avg
2.6 Stats Aggregation
Stats聚合屬于多名額聚合,用于計算文檔中指定字段的多個屬性,包括 min, max, sum, count and avg。
以下以學生成績為案例:
建立索引:
PUT exams
{
"mappings": {
"properties": {
"name":{
"type": "keyword"
},
"grade":{
"type": "double"
}
}
}
}
寫入2條資料:
PUT exams/_bulk?refresh=true
{ "index":{"_id":1}}
{ "name":"xiaoming","grade":50}
{ "index":{"_id":2}}
{ "name":"zhangsan","grade":100}
stats聚合:
GET exams/_search?size=0
{
"aggs": {
"function_stats": {
"stats": {
"field": "grade"
}
}
}
}
可選參數:
"missing":具體數值, 當無grade字段時将會使用指定數值來代替
script(将field更改為如下内容):
"script" : {
"lang": "painless",
"source": "doc['grade'].value"
}
script方式擷取字段後,可以設定字段的correction,統計時grade值為原始字段值*correction
"script" : {
"lang": "painless",
"source": "doc.grade.value * params.correction",
"params" : {
"correction" : 1.2
}
}
結果:
{
...
"aggregations" : {
"function_stats" : {
"count" : 2,
"min" : 50.0,
"max" : 100.0,
"avg" : 75.0,
"sum" : 150.0
}
}
}
2.7 Extended Stats Aggregation
Extended Stats聚合屬于多指名額聚合,用于計算文檔中指定字段的多個屬性,它對Stats進行了擴充,包括 sum_of_squares, variance, std_deviation and std_deviation_bounds幾個參數。
以下以學生成績為案例:
extend stats聚合:
GET exams/_search?size=0
{
"aggs": {
"function_stats": {
"extended_stats": {
"field": "grade",
"sigma": 1,
"missing": 0
}
}
}
}
可選參數:
sigma: 預設為2,
std_deviation_bounds區間為[-2*std_deviation+avg,2*std_deviation+avg],但設定為1後[-std_deviation+avg,std_deviation+avg]
missing: grade缺失時候使用missing值來代替
結果:
{
...
"aggregations" : {
"function_stats" : {
"count" : 2,
"min" : 50.0,
"max" : 100.0,
"avg" : 75.0,
"sum" : 150.0,
"sum_of_squares" : 12500.0,
"variance" : 625.0,
"std_deviation" : 25.0,
"std_deviation_bounds" : {
"upper" : 100.0,
"lower" : 50.0
}
}
}
}
2.8 Cardinality Aggregation
Cardinality 聚合屬于單名額聚合,用于計算文檔中指定字段的不同值的數量,即去重後有多少個值
GET exams/_search?size=0
{
"aggs" : {
"differ_grade" : {
"cardinality" : {
"field" : "grade"
}
}
}
}
輸出:
{
..
"aggregations" : {
"differ_grade" : {
"value" : 2
}
}
}
此處使用2.2.7中的資料,有2個學生分數不相同,是以為2;若增加底三個學生分數為50,則值仍然為2;若增加底三個學生分數為51,則值仍然為3
待補充
3 注意事項
to add
4 說明
測試環境:es 7.2.1
7.2/search-aggregations
es 權威指南:aggs-high-level