ランダムサンプラー集約
この機能は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。
サンプリングは、シャード内の全文書のランダムなサブセットを提供することによって実現されます。検索リクエストにフィルタークエリが提供されると、そのフィルターはサンプリングされたサブセットに適用されます。したがって、フィルターが制限的である場合、マッチする文書は非常に少なくなる可能性があり、そのため統計が正確でない可能性があります。
この集約は、[サンプラー集約](/read/elasticsearch-8-15/8e6d84090fa3ab1c.md)と混同しないでください。サンプラー集約はすべての文書に対してではなく、クエリによってマッチした最初の`````n`````文書をサンプリングします。
#### Python
``````python
resp = client.search(
index="kibana_sample_data_ecommerce",
size="0",
track_total_hits=False,
aggregations={
"sampling": {
"random_sampler": {
"probability": 0.1
},
"aggs": {
"price_percentiles": {
"percentiles": {
"field": "taxful_total_price"
}
}
}
}
},
)
print(resp)
`
Ruby
response = client.search(
index: 'kibana_sample_data_ecommerce',
size: 0,
track_total_hits: false,
body: {
aggregations: {
sampling: {
random_sampler: {
probability: 0.1
},
aggregations: {
price_percentiles: {
percentiles: {
field: 'taxful_total_price'
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "kibana_sample_data_ecommerce",
size: 0,
track_total_hits: "false",
aggregations: {
sampling: {
random_sampler: {
probability: 0.1,
},
aggs: {
price_percentiles: {
percentiles: {
field: "taxful_total_price",
},
},
},
},
},
});
console.log(response);
コンソール
GET kibana_sample_data_ecommerce/_search?size=0&track_total_hits=false
{
"aggregations": {
"sampling": {
"random_sampler": {
"probability": 0.1
},
"aggs": {
"price_percentiles": {
"percentiles": {
"field": "taxful_total_price"
}
}
}
}
}
}
random_samplerのトップレベルパラメータ
probability
- (必須、浮動小数点) 文書が集約データに含まれる確率。0より大きく、
0.5
より小さく、または1
と等しくなければなりません。確率が低いほど、マッチする文書は少なくなります。 seed
- (オプション、整数) 文書のランダムサンプリングを生成するためのシード。シードが提供されると、文書のランダムサブセットは呼び出し間で同じになります。
サンプリングはどのように機能しますか?
集約はインデックス内のすべての文書のランダムサンプルです。言い換えれば、サンプリングはバックグラウンドの文書セットに対して行われます。クエリが提供されると、文書がクエリによってマッチし、かつ文書がランダムサンプリングに含まれている場合に返されます。サンプリングはマッチした文書に対して行われません。
文書のセット[1, 2, 3, 4, 5]
を考えてみてください。あなたのクエリは[1, 3, 5]
にマッチし、ランダムにサンプリングされたセットは[2, 4, 5]
です。この場合、返される文書は[5]
になります。
このタイプのサンプリングは、サンプリングが文書セットのサイズを減少させる量に関連して、クエリのレイテンシーをほぼ線形に改善します:
このグラフは、6300万文書のテストデータセットに対する大多数の集約の速度向上の典型的なものです。正確な定数はデータセットのサイズとシャードの数に依存しますが、速度向上と確率の関係の形は広く成り立ちます。特定の集約においては、速度向上がそれほど劇的でない場合もあります。これらの集約には、見られる文書の数に関連しない一定のオーバーヘッドがあります。それらの集約においても、速度の改善は重要である可能性があります。
サンプルセットは、成功確率が提供されたprobability
(分布方程式のp
)である幾何分布((1-p)^(k-1)*p
)を使用して文書をスキップすることによって生成されます。分布から返される値は、バックグラウンドでスキップする文書の数を示します。これは、文書を均等にランダムに選択することに相当します。成功する前の期待される失敗の数は(1-p)/p
です。たとえば、"probability": 0.01
の場合、期待される失敗の数(またはスキップされた文書の平均数)は99
で、分散は9900
です。したがって、インデックスに80文書しかないか、フィルターによってマッチした場合、結果はほとんど得られないでしょう。
上の画像では、p
は集約に提供された確率であり、n
は提供されたクエリによってマッチした文書の数です。外れ値がsum
およびmean
に与える影響を見ることができますが、多くの文書が高いサンプリング率でまだマッチしている場合、相対誤差は依然として低いです。
これは、上部尾に外れ値を持つ典型的な正の歪みのAPMデータセットに対する集約の結果を表しています。相対誤差がサンプルサイズに線形に依存することは広く成り立ちますが、傾きは集約される量の変動に依存します。そのため、自分のデータの分散は相対誤差率が異なる速度で増加または減少する原因となる可能性があります。
ランダムサンプラーの一貫性
特定のprobability
およびseed
に対して、ランダムサンプラー集約は同じシャードから変更されていないデータをサンプリングする場合に一貫性があります。ただし、特定の文書がサンプリングセットに含まれるかどうかは、現在のセグメント数に依存するため、これはバックグラウンドのランダムサンプリングです。
つまり、レプリカシャードとプライマリシャードは、異なる特定の文書がサンプリングされるため、異なる値を返す可能性があります。
シャードが文書の追加、更新、削除、またはセグメントのマージによって変更されると、サンプリングされる特定の文書が変更され、その結果、統計が変わる可能性があります。
ランダムサンプラー集約から得られる統計は近似値であり、そのように扱うべきです。
ランダムサンプリングの特別なケース
ランダムサンプラー集約によって返されるすべてのカウントは、視覚化と計算を容易にするためにスケーリングされます。たとえば、日付ヒストグラム集約をランダムにサンプリングする場合、各バケットのすべてのdoc_count
値は、ランダムサンプラーprobability
値の逆数でスケーリングされます。したがって、バケットのdoc_count
が10,000
でprobability: 0.1
の場合、実際に集約された文書の数は1,000
です。
これに対する例外はカーディナリティ集約です。ユニークアイテムのカウントは自動スケーリングには適していません。カーディナリティカウントを解釈する際は、ランダムサンプラー集約内のトップレベルdoc_count
で提供されるサンプル文書の数と比較してください。これにより、ユニークな値の割合を全体の値の割合として把握できます。ただし、特定のフィールドに対するユニークな値の正確な数を反映しない場合があります。