本記事では、Elasticsearch 7.10で6.8から新しく追加された集計機能について詳しく見ていきます。
レアターム集計
概要
この集計は、フィールド内の稀に出現する値を検出するために使用されます。通常のタームクエリを使用した正順ソートでは、大量のデータや高基数(多くの異なる値を持つ)データセットで「unbounded」エラーが発生することがあります。レア集計は、このようなシナリオでの検索方法を補完するものです。ただし、この集計で計算される結果は近似値であることに注意が必要です。
制約事項
使用上の制限
- keyword、numeric、ip、またはbooleanタイプのフィールドのみ使用可能
- max_doc_countパラメータで文書数を制限(デフォルトは1)
- precision_thresholdパラメータで精度を制御(デフォルトは3000)
パフォーマンスに関する考慮点
- 高基数フィールドでのパフォーマンスが良好
- メモリ消費量が比較的大きい
- 集計はシャードレベルで実行されるため、適切なシャードサイズの使用が推奨される
精度の制御
- 結果は近似値
- precision_thresholdで精度を調整可能(精度を上げるとメモリ消費も増加)
累積カーディナリティ集計
概要
このパイプライン集計は、ヒストグラム(またはdate_histogram)集計内の累積基数を計算します。累積カーディナリティ集計は、特定の期間内の「新しい項目」を特定するのに役立ちます。例えば、毎日のウェブサイトの新規訪問者数などです。通常のカーディナリティ集計は毎日のユニーク訪問者数を教えてくれますが、「新規」か「リピーター」かの区別はしません。累積カーディナリティ集計を使用すると、毎日何人のユニーク訪問者が「新規」であるかを特定できます。
precision_thresholdパラメータで精度を調整でき、精度が上がるほどメモリ消費も増加します。実際の要件に応じて精度を調整し、不必要な高精度設定を避けることが推奨されます。
使用要件
- date_histogramまたはhistogram集計が必要
- カーディナリティメトリック集計が必要
- buckets_pathは有効なカーディナリティ集計を指している必要がある
実装例
GET /website_access_logs/_search
{
"size": 0,
"aggs": {
"daily_access": {
"date_histogram": {
"field": "access_time",
"calendar_interval": "day"
},
"aggs": {
"unique_visitors": {
"cardinality": {
"field": "visitor_id"
}
},
"cumulative_new_visitors": {
"cumulative_cardinality": {
"buckets_path": "unique_visitors"
}
}
}
}
}
}
ジオタイルグリッド集計
概要
geo_pointフィールドに基づく地理的位置を対象としたマルチバケット集計です。地理空間データをグリッドに分割し、可視化と分析を容易にします。
重要なポイント
- グリッド設定:precisionパラメータ(0-29)でグリッドの精度を制御。精度が高いほどグリッドが小さくなり、バケット数が増加。
- 高精度設定では多数のバケットが生成され、メモリ消費が増加。
- geo_pointタイプのフィールドのみサポート。
実装例
POST /points_of_interest/_search?size=0
{
"aggregations": {
"geo_grid": {
"geotile_grid": {
"field": "coordinates",
"precision": 20,
"bounds": {
"top_left": "35.7, 139.7",
"bottom_right": "35.6, 139.8"
}
}
}
}
}
t検定集計
概要
t検定は統計的仮説検定の一種で、検定統計量が帰無仮説のもとで「学生のt分布(Student's t-distribution)」に従うかどうかを判断するために使用されます。集計ドキュメントから抽出された数値または提供されたスクリプトによって生成された数値に適用できます。この集計は検定のp値(確率値)を返します。これは、帰無仮説が正しい場合(つまり、母平均に差がない場合)、集計が処理した結果と同程度に極端な結果が得られる確率です。p値が小さいほど、帰無仮説が誤っている可能性が高く、実際には母平均に差があることを示します。
学生のt分布について
学生のt分布(Student's t-distribution)は、単にt分布とも呼ばれ、確率分布の一種です。統計学において重要な位置を占めており、特にサンプルサイズが小さく、母標準偏差が不明な場合の母平均の推定と仮説検定に使用されます。正規分布に似た釣り鐘型の曲線ですが、正規分布よりも「裾」が厚い特徴があります。つまり、t分布では平均値の両側での極端な値の出現確率が正規分布よりも高くなります。
実装例
GET /system_performance/_search
{
"size": 0,
"aggs": {
"response_time_comparison": {
"t_test": {
"a": { "field": "response_time_v1" },
"b": { "field": "response_time_v2" },
"type": "paired"
}
}
}
}
可変幅ヒストグラム集計
概要
ヒストグラムに似たマルチバケット集計ですが、ヒストグラムとは異なり、各バケットの幅は事前に指定されるのではなく、目標バケット数に基づいて動的に決定されます。
パラメータ設定
- fieldは数値タイプである必要がある
- bucketsパラメータで目標バケット数を指定
- 実際のバケット数は指定値より少なくなる可能性がある
パフォーマンスに関する考慮点
- 固定幅ヒストグラムよりもリソースを消費し、大規模なデータセットでは遅くなる可能性がある
- 目標バケット数を制限することが推奨される
使用シナリオ
- データ分布が不均一な場合に特に有用
- 探索的データ分析に適している
- 空のバケットまたは過密なバケットを回避できる
正規化集計
概要
特定のバケット値の正規化または再スケーリングされた値を計算するためのパイプライン集計です。
正規化手法
利用可能な正規化手法は以下の通りです:
- rescale_0_1:0から1への再スケーリング。最小値を0、最大値を1にし、その他の値はその間で線形に正規化。
- rescale_0_100:0から100への再スケーリング。最小値を0、最大値を100にし、その他の値はその間で線形に正規化。
- percent_of_sum:合計に対する割合。各値を合計値に対する割合として正規化。
- mean:平均値正規化。各値を平均値との差に基づいて正規化。
- zscore:Zスコア正規化。各値を平均値からの標準偏差として表現。
- softmax:ソフトマックス正規化。各値の指数を取り、元の値の指数の合計に対して正規化。
パラメータ設定
- methodパラメータで正規化手法を指定
- buckets_pathでデータソースを指定
- 欠損値の処理を設定可能
移動パーセンタイル集計
概要
一連の順序付けられたパーセンタイルに対して、移動パーセンタイル集計はこれらのパーセンタイル上でウィンドウをスライドさせ、累積パーセンタイルを計算します。
shiftパラメータについて
デフォルト(shift = 0)では、計算に使用されるウィンドウは現在のバケットを除いた最後のn個の値です。shiftを1増やすと、ウィンドウの開始位置が1単位右に移動します。
- 現在のバケットをウィンドウに含めるには、shift = 1を使用。
- 中央揃え(現在のバケットの前後にn/2個の値)には、shift = window / 2を使用。
- 右揃え(現在のバケットの後にn個の値)には、shift = windowを使用。
ウィンドウの端がデータ系列の境界を越えると、ウィンドウは利用可能な値のみを含むように縮小されます。
レート集計
概要
date_histogram集計と組み合わせて使用し、各date_histogramバケット内のドキュメントレートまたはフィールドレートを計算します。
レート集計は秒、分、時間など複数の時間単位をサポートしており、使用時には単位を明示的に指定する必要があります。ドキュメント数またはフィールド値の計算に使用できますが、必ずdate_histogramと一緒に使用する必要があります。