1. 程式人生 > >Elasticsearch 管道聚合

Elasticsearch 管道聚合

管道聚合


管道聚合處理其他聚合產生的輸出,而不是處理文件集,它將資訊新增到輸出樹。存在許多不同型別的管道聚合,這些聚合從其他的聚合中計算不同的資訊,這些聚合主要分成兩類:

  • 雙親:與雙親聚合輸出一起提供的一系列管道聚合,可以用於計算新增到已存在桶的新的桶或聚合。
  • 兄弟:與兄弟聚合輸出一起提供的管道聚合,用於計算與兄弟聚合處於相同級別的新聚合。

通過使用buckets_path引數指明所需度量的路徑,管道聚合可以引用需要執行計算的聚合。

管道聚合沒有子聚合,不過根據型別,它可以引用bucks_path中的其他的管道,從而使管道聚合鏈化。

因為管道聚合只新增到輸出,當鏈化聚合時,每個管道聚合的輸出將會包含在最終輸出中。

1 buckets_path 語法

大多數的管道聚合將其他聚合作為輸入。輸入聚合通過buckets_path引數定義。

AGG_SEPARATOR = ‘>’ ;
METRIC_SEPARATOR = ‘.’ ;
AGG_NAME = ;
METRIC = <the name of the metric (in case of multi-value metrics aggregation)> ;
PATH = <AGG_NAME> [ <AGG_SEPARATOR>, <AGG_NAME> ]* [ <METRIC_SEPARATOR>, ] ;

路徑相對於管道聚合所在的位置,這些路徑不是絕對路徑,並且不能回到聚合樹上。

{
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "day"
      },
      "aggs": {
        "the_sum": {
          "sum": {"field": "lemmings"}
        },
        "the_movavg": {
          "moving_avg"
: {"buckets_path": "the_sum"} } } } } }

note:移動平均數內嵌於日期柱狀圖之中,引用兄弟度量"the_sum"。
note:buckets_path通過相對路徑"the_sum"引用度量。

buckets_path也可以用於兄弟管道聚合,此聚合鄰近一系列桶聚合,而不是內嵌於它們。

{
  "aggs": {
    "sales_per_month": {
      "data_histogram": {
        "filed": "date",
        "interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        }
      }
    },
    "max_monthly_sales": {
      "max_bucket": {
        "buckets_path": "sales_per_month>sales"
      }
    }
  }
}

note:max_bucket聚合使用buckets_path指定鑲嵌在兄弟聚合中的度量。
note:buckets_path指示sales_per_month日期柱狀圖聚合之中用於獲取sales聚合最大值的最大桶聚合。

2 特定路徑

除了路徑到度量,buckets_path還可以使用特定"_count"路徑。這指示管道聚合將文件計數用作輸入。

{
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "day"
      },
      "aggs": {
        "the_movavg": {
          "moving_avg": {"buckets_path": "_count" }
        }
      }
    }
  }
}

note:可以根據每個桶的文件計數來計算移動平均值,而不使用特定度量。
note:通過使用_count取代度量名稱,可以計算樹狀圖中文件計數的移動平均值。

buckets_path還可以使用"_bucket_count"與多桶聚合的路徑來使用由管道聚合返回的桶數,而不是使用度量。

{
  "size": 0,
  "aggs": {
    "histo": {
      "date_histogram": {
        "field": "date",
        "interval": "day"
      },
      "aggs": {
        "categories": {
          "terms": {
            "field": "category"
          }
        },
        "min_bucket_selector": {
          "bucket_selector": {
            "buckets_path": {
              "count": "categories._bucket_count"
            },
            "script": {
              "source": "params.count != 0"
            }
          }
        }
      }
    }
  }
}

note:bucket_selector用於篩掉無內部欄位值聚合桶的桶。
note:通過使用_bucket_count取代度量名稱,可以將不包含categories聚合桶的histo桶過濾掉。

3 處理聚合名稱中的點

為了處理名稱中帶有點的聚合或度量可以使用以下語法:

"buckets_path": "my_percentile[99.9]"

4 處理資料中的缺口

真實世界中的資料常常嘈雜且具有缺口(資料不存在的位置)。
這可能會有多種原因,常見的有:

  • 落入桶中的文件沒有包含指定欄位
  • 沒有文件匹配一個或多個桶的查詢
  • 被計算的度量值不能生成值,很可能時因為其他依賴的桶缺失值。一些管道聚合具有需要被滿足的特殊需求。(例如,導數不能計算度量的第一個值,因為沒有過去的值,HoltWinters移動平均值在開始計算前需要“升溫”資料等)

缺口策略用於在缺口或確實資料遭遇時,通知對應管道聚合應做的行為。所有的管道聚合接收gap_policy引數。

當前有兩種策略可以選擇:

  • skip,此選項以桶不存在缺失資料來對待缺口。它將會跳過桶並且使用下一個可用值進行計算。
  • insert_zeros,此選項會使用零值來替換缺失,管道聚合則會照常計算。

翻譯源:Elasticsearch 6.4 文件