大規模な時系列インデックスに対する時間範囲クエリは、標準の Elasticsearch が一致するデータが含まれているかどうかにかかわらずすべてのセグメントをスキャンするため、処理が遅くなる可能性があります。プルーニング機能は、Alibaba Cloud Elasticsearch がインデックスセグメントをマージする方法を変更することでこの問題に対処します。時間的に隣接するデータをまとめて保持することで、クエリがクエリ範囲外のセグメントを完全にスキップできるようにします。これにより、クエリレイテンシーが最大 40% 削減されます。
このトピックのすべてのコマンドは、Kibana コンソールで実行します。詳細については、「Kibana コンソールへのログイン」をご参照ください。
前提条件
Alibaba Cloud Elasticsearch V6.7.0 または V7.10.0 クラスターが作成されている必要があります。V6.7.0 クラスターのカーネルバージョンは 1.2.0 以降である必要があります。クラスターの作成方法の詳細については、「Alibaba Cloud Elasticsearch クラスターの作成」をご参照ください。
サポートされているバージョン
プルーニング機能は、以下で利用可能です。
カーネルバージョン 1.2.0 以降の Alibaba Cloud Elasticsearch V6.7.0
Alibaba Cloud Elasticsearch V7.10.0
プルーニング機能の仕組み
標準の Elasticsearch は、サイズのみに基づいてインデックスセグメントをマージします。類似したサイズのセグメントがマージされるため、単一のセグメントが任意の時間範囲にまたがることがあります。この場合、時間範囲クエリは、一致するデータを見つけるためにすべてのセグメントをスキャンする必要があります。
プルーニングが有効になっている場合、セグメントのマージはサイズと時系列フィールドの両方を考慮します。類似したサイズで、かつ隣接する期間のデータを含むセグメントがマージされます。結果として得られる各セグメントは連続する時間範囲を保持するため、Elasticsearch はクエリされた時間範囲外のセグメントを完全にスキップできます。
| 標準の Elasticsearch | Alibaba Cloud Elasticsearch (プルーニング有効時) | |
|---|---|---|
| セグメントのマージポリシー | サイズのみに基づく。セグメントは任意の時間範囲にまたがる | サイズと時系列フィールドに基づく。各セグメントは連続する時間範囲を保持する |
| クエリパフォーマンス | すべてのクエリに対してすべてのセグメントをスキャンする | クエリされた時間範囲外のセグメントをスキップする。パフォーマンスを 40% 向上させる |
制限事項
インデックス作成時にプルーニングを有効にします。プルーニングは、インデックス作成およびコンパクション中のセグメントのマージ方法に影響します。インデックス作成後に有効にした場合、期待されるクエリパフォーマンスは得られません。
無効にした後、プルーニングを再度有効にしないでください。インデックスのプルーニング機能を無効にした後、そのインデックスに対して再度この機能を有効にしないことを推奨します。再度有効にした場合、インデックスのセグメントマージが時系列データではないデータをカバーすると、期待されるクエリパフォーマンスは得られません。
時系列フィールドは DATE または LONG 型である必要があります。
プルーニング機能を有効にする
インデックス作成時に時系列フィールドを指定します。次の例では、timestamp を時系列フィールドとして使用しています。
PUT index-1/_settings
{
"index" : {
"merge.policy.time_series_field" : "timestamp"
}
}時系列データのクエリ
プルーニングを利用するには、時系列フィールドで range フィルターを使用します。Elasticsearch は、時間範囲全体がフィルター外にあるセグメントをスキップし、関連するセグメントのみを検索します。
次の例では、timestamp フィールドと region フィールドでデータをフィルターします。
POST index-1/_search
{
"query": {
"bool": {
"filter": [
{
"range": {
"timestamp": {
"format": "yyyy-MM-dd HH:mm:ss",
"gte": "2020-06-01 23:00:00",
"lt": "2020-06-06 23:05:00",
"time_zone": "+08:00"
}
}
},
{
"terms": {
"region": [
"sh"
]
}
}
]
}
}
}プルーニング機能を無効にする
プルーニングを無効にするには、インデックスをクローズし、設定を更新して、再オープンする必要があります。
プルーニングを無効にした後、同じインデックスで再度有効にしないでください。詳細については、「制限事項」をご参照ください。
インデックスをクローズします。
POST index-1/_closeプルーニングを無効にするには、
merge.policy.time_series_fieldをnullに設定します。PUT index-1/_settings { "index" : { "merge.policy.time_series_field" : null } }インデックスを再オープンします。
POST index-1/_open