可変幅ヒストグラム集約
これは、ヒストグラムに似たマルチバケット集約です。しかし、各バケットの幅は指定されていません。代わりに、目標となるバケット数が提供され、バケットの間隔はドキュメントの分布に基づいて動的に決定されます。これは、バケットの重心間の距離を低く保つことを目的としたシンプルな一回通過のドキュメントクラスタリングアルゴリズムを使用して行われます。他のマルチバケット集約とは異なり、間隔は必ずしも均一な幅を持つわけではありません。
返されるバケットの数は、常に目標数以下になります。
2つのバケットを目標としてリクエストします。
Python
resp = client.search(
index="sales",
size="0",
aggs={
"prices": {
"variable_width_histogram": {
"field": "price",
"buckets": 2
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'sales',
size: 0,
body: {
aggregations: {
prices: {
variable_width_histogram: {
field: 'price',
buckets: 2
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "sales",
size: 0,
aggs: {
prices: {
variable_width_histogram: {
field: "price",
buckets: 2,
},
},
},
});
console.log(response);
コンソール
POST /sales/_search?size=0
{
"aggs": {
"prices": {
"variable_width_histogram": {
"field": "price",
"buckets": 2
}
}
}
}
コンソール結果
{
...
"aggregations": {
"prices": {
"buckets": [
{
"min": 10.0,
"key": 30.0,
"max": 50.0,
"doc_count": 2
},
{
"min": 150.0,
"key": 185.0,
"max": 200.0,
"doc_count": 5
}
]
}
}
}
この集約は、現在、単一のバケットから収集する以外の集約の下にネストすることはできません。
クラスタリングアルゴリズム
各シャードは最初のinitial_buffer
ドキュメントを取得し、それらをメモリに保存します。バッファが満杯になると、これらのドキュメントはソートされ、3/4 * shard_size buckets
に線形に分離されます。次に、残りの各ドキュメントは、最も近いバケットに収集されるか、既存のすべてのバケットから遠い場合は新しいバケットに配置されます。最大でshard_size
の合計バケットが作成されます。
リデュースステップでは、コーディネーティングノードがすべてのシャードからバケットをその重心によってソートします。次に、最も近い重心を持つ2つのバケットが、目標のバケット数が達成されるまで繰り返しマージされます。このマージ手順は、凝集階層クラスタリングの一形態です。
シャードはshard_size
バケットより少ない数を返すことができますが、それ以上を返すことはできません。
シャードサイズ
shard_size
パラメータは、コーディネーティングノードが各シャードからリクエストするバケットの数を指定します。shard_size
が高いと、各シャードはより小さなバケットを生成します。これにより、リデュースステップ後にバケットが重なる可能性が減ります。shard_size
を増やすと、ヒストグラムの精度が向上しますが、最終結果を計算するのがより高価になります。なぜなら、シャードレベルでより大きな優先度キューを管理しなければならず、ノード間およびクライアント間のデータ転送が大きくなるからです。
パラメータbuckets
、shard_size
、およびinitial_buffer
はオプションです。デフォルトでは、buckets = 10
、shard_size = buckets * 50
、およびinitial_buffer = min(10 * shard_size, 50000)
です。
初期バッファ
initial_buffer
パラメータは、初期バケットアルゴリズムが実行される前に、シャード上のメモリに保存される個々のドキュメントの数を指定するために使用できます。バケットの分布は、initial_buffer
ドキュメントのこのサンプルを使用して決定されます。したがって、initial_buffer
が高いと、より多くのメモリを使用しますが、より代表的なクラスターをもたらします。
バケットの境界は近似値です
リデュースステップ中、マスターノードは常に最も近い重心を持つ2つのバケットをマージします。2つのバケットが重なる境界を持っているが、重心が遠い場合、それらがマージされない可能性があります。このため、リデュース後にある間隔(max
)の最大値が、次のバケット(min
)の最小値より大きくなることがあります。このエラーの影響を減らすために、そのような重複が発生した場合、これらの間隔の境界は(max + min) / 2
に調整されます。
バケットの境界は外れ値に非常に敏感です。