Elasticsearch (ES) は、複雑な集計クエリ、高カーディナリティの term クエリ、ベクトル検索を処理する際に、パフォーマンスボトルネックが発生することがあります。FalconSeek クラウドネイティブカーネルは、Alibaba 独自の Havenask エンジンをベースに構築されています。C++ のカラムナメモリと完全非同期フレームワークを使用することで、ES エコシステムとの完全な互換性を維持しながら、クエリパフォーマンスを大幅に向上させます。本トピックでは、FalconSeek を有効にしてクエリを高速化する方法について説明します。インスタンスの作成、インデックスレベルおよびフィールドレベルの設定、クエリポリシーの管理を対象としています。また、ベクトル検索など、パフォーマンスが重視されるシナリオ向けの最適化プラクティスも提供します。
適用範囲
招待制プレビューと無料利用:FalconSeek は、限定的な無料テスト段階にあります。ホワイトリストへの追加をご希望の場合は、テクニカルサポートまでご連絡ください。
バージョン制限:この機能には Elasticsearch バージョン 8.17.0 が必要です。バージョンのスペックアップまたはスペックダウンはできません。
インスタンス制限:FalconSeek は、新規購入の Vector Enhanced Edition インスタンスでのみ有効化できます。既存のインスタンスはサポートされていません。
インスタンスの作成と FalconSeek の有効化
FalconSeek は、新しいインスタンスを作成する場合にのみ有効化できます。以下の手順に従って設定を完了してください。
インスタンス購入ページで、FalconSeek を有効にします。
インスタンスタイプ: Vector Enhanced Edition である必要があります。
インスタンスタイプ:[8.17.0 (ベクトルシナリオに推奨)] を選択します。
高度な拡張機能: [FalconSeek クラウドネイティブカーネル] を選択します。
必要に応じて、VPC や インスタンスタイプ などのその他のパラメーターを設定し、支払いプロセスを完了します。
インスタンスの作成後、Kibana コンソールで次のコマンドを実行し、FalconSeek がクラスターレベルで有効になっていることを確認します。
GET _cluster/settings?include_defaults&filter_path=defaults.havenask.engine.enabled応答の
enabledフィールドがtrueの場合、機能は有効です。{ "defaults": { "havenask": { "engine": { "enabled": "true" } } } }
インデックスでの FalconSeek の使用
インスタンスで FalconSeek を有効にしても、デフォルトではどのインデックスでも有効にはなりません。高速化したい特定のインデックスに対して、インデックス設定を使用して FalconSeek エンジンを明示的に有効にする必要があります。
新規インデックスでの FalconSeek の有効化
インデックスを作成するときは、
settingsにパラメーター"index.havenask.engine.enabled": trueを追加して FalconSeek を有効にします。PUT falcon_seek_test { "settings": { "index.havenask.engine.enabled": true // FalconSeek を有効化 }, "mappings": { "properties": { "foo": { "type": "keyword" } } } }データを書き込みます。
POST falcon_seek_test/_bulk {"index":{}} {"foo":"hello"} {"index":{}} {"foo":"world"} {"index":{}} {"foo":"cpp"} {"index":{}} {"foo":"java"}データをクエリします。デフォルトで FalconSeek が使用されます。
GET falcon_seek_test/_search { "query": { "term":{ "foo":{ "value": "hello" } } }, "sort": [ { "_doc": { "order": "desc" } } ] }
既存インデックスでの FalconSeek の有効化
次のコマンドはインデックスを作成しますが、高速化は有効にしません。
PUT my_existing_index { "settings": { "number_of_shards": 5, "number_of_replicas": 1 }, "mappings": { "properties": { "foo": { "type": "keyword" } } } }_settingsAPI を使用してインデックス構成を更新し、機能を動的に有効にします。PUT my_existing_index/_settings { "index.havenask.engine.enabled": true }この設定を有効にするには、
POST /my_existing_index/_closeを実行してインデックスを閉じ、次にPOST /my_existing_index/_openを実行して再度開く必要があります。
クエリ実行ポリシーの管理
FalconSeek は柔軟なクエリ実行ポリシーを提供します。リクエストを FalconSeek で処理するか、ネイティブの Elasticsearch エンジンにフォールバックするかを制御できます。これは、インデックスレベルまたは個々のクエリで設定できます。ポリシーを設定するには、インデックスレベルで index.havenask.engine.search.type パラメーターを使用するか、クエリレベルで havenask_search_type パラメーターを使用します。クエリレベルのパラメーターが優先されます。
ポリシー | 説明 | 推奨シナリオ |
| クエリは FalconSeek による実行が優先されます。サポートされていない構文や機能が検出された場合、リクエストは自動的にネイティブの Elasticsearch エンジンにフォールバックします。 | パフォーマンスと互換性の両方が要求される一般的な本番環境。 |
| クエリはネイティブの Elasticsearch エンジンで強制的に実行されます。 | パフォーマンスを比較する必要がある場合や、FalconSeek の未知の問題をバイパスする場合。 |
| クエリは強制的に FalconSeek エンジンで実行されます。サポートされていない構文や機能が検出された場合、システムは直接例外をスローし、フォールバックしません。 | デバッグシナリオ。 |
インデックスレベルでのデフォルトクエリポリシーの設定
次の例では、my_index に対するすべてのクエリが、デフォルトでネイティブの Elasticsearch エンジンで実行されるように設定します。
PUT my_index/_settings
{
"index.havenask.engine.search.type": "es"
}クエリに対するデフォルトポリシーの一時的なオーバーライド
my_index インデックスがデフォルトで native ポリシーを使用する場合、クエリリクエストに havenask_search_type パラメーターを追加することで、特定のクエリがネイティブ Elasticsearch エンジンを使用するように強制できます。
方法 1:URL パラメーターとして
GET my_index/_search?havenask_search_type=es { "query": { "match_all": {} } }方法 2:リクエストボディパラメーターとして
GET my_index/_search { "query": { "match_all": {} }, "havenask_search_type": "es" }
FalconSeek によるベクトル検索の高速化
FalconSeek は、元の ES インデックススキーマの上に、新しい C++ ベースのベクトルインデックスを追加します。FalconSeek ベクトルインデックスは Alibaba によって開発され、淘宝 (Taobao) や天猫 (Tmall) の検索・推薦、拍立淘 (画像検索) など、Alibaba Group 内の主要なサービスをサポートしています。FalconSeek カーネルに統合された高性能なベクトルインデックスを使用することで、画像検索やセマンティック検索などの効率的な AI アプリケーションを構築できます。
ベクターインデックスを作成し、イメージまたはテキストベクターを格納するために
mappingsにmage_vectorという名前のdense_vectorフィールドを定義し、インデックスで FalconSeek を有効にします。PUT vector_index { "settings": { "index.havenask.engine.enabled": true }, "mappings": { "properties": { "image_vector": { "type": "dense_vector", "dims": 128 , "index_options": { "type": "havenask_native" } }, "title": { "type": "keyword" } } } }ベクトルデータを書き込むには、
_bulkまたは_indexAPI を使用してドキュメントを書き込みます。ベクターフィールドの値は、浮動小数点数の配列です。POST vector_index/_bulk {"index":{"_id":"1"}} {"image_vector":[0.12, -0.05, 0.08, 0.24, -0.17, 0.31, 0.02, -0.19, 0.11, 0.28, -0.03, 0.15, 0.22, -0.11, 0.09, 0.33, -0.07, 0.14, 0.26, -0.21, 0.18, 0.29, -0.13, 0.06, 0.35, -0.08, 0.16, 0.23, -0.15, 0.12, 0.27, -0.22, 0.19, 0.32, -0.14, 0.07, 0.25, -0.18, 0.13, 0.30, -0.09, 0.17, 0.24, -0.16, 0.10, 0.34, -0.10, 0.20, 0.31, -0.23, 0.15, 0.28, -0.12, 0.11, 0.26, -0.19, 0.14, 0.29, -0.17, 0.08, 0.22, -0.20, 0.16, 0.27, -0.15, 0.09, 0.25, -0.21, 0.18, 0.30, -0.13, 0.07, 0.24, -0.22, 0.19, 0.32, -0.16, 0.10, 0.26, -0.18, 0.12, 0.28, -0.14, 0.06, 0.23, -0.19, 0.15, 0.29, -0.11, 0.05, 0.21, -0.17, 0.13, 0.27, -0.10, 0.04, 0.20, -0.15, 0.11, 0.25, -0.09, 0.03, 0.19, -0.13, 0.10, 0.24, -0.08, 0.02, 0.18, -0.12, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22, 0.05, -0.06, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22],"title":"Image One"} {"index":{"_id":"2"}} {"image_vector":[0.12, -0.05, 0.08, 0.24, -0.17, 0.31, 0.02, -0.19, 0.11, 0.28, -0.03, 0.15, 0.22, -0.11, 0.09, 0.33, -0.07, 0.14, 0.26, -0.21, 0.18, 0.29, -0.13, 0.06, 0.35, -0.08, 0.16, 0.23, -0.15, 0.12, 0.27, -0.22, 0.19, 0.32, -0.14, 0.07, 0.25, -0.18, 0.13, 0.30, -0.09, 0.17, 0.24, -0.16, 0.10, 0.34, -0.10, 0.20, 0.31, -0.23, 0.15, 0.28, -0.12, 0.11, 0.26, -0.19, 0.14, 0.29, -0.17, 0.08, 0.22, -0.20, 0.16, 0.27, -0.15, 0.09, 0.25, -0.21, 0.18, 0.30, -0.13, 0.07, 0.24, -0.22, 0.19, 0.32, -0.16, 0.10, 0.26, -0.18, 0.12, 0.28, -0.14, 0.06, 0.23, -0.19, 0.15, 0.29, -0.11, 0.05, 0.21, -0.17, 0.13, 0.27, -0.10, 0.04, 0.20, -0.15, 0.11, 0.25, -0.09, 0.03, 0.19, -0.13, 0.10, 0.24, -0.08, 0.02, 0.18, -0.12, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22, 0.05, -0.06, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22],"title":"Image Two"}k-NN ベクトル検索を実行します。
knnクエリ句を使用して、指定されたベクターに最も類似している上位 K 件の結果を検索します。GET vector_index/_search { "knn": { "field": "image_vector", "query_vector": [0.12, -0.05, 0.08, 0.24, -0.17, 0.31, 0.02, -0.19, 0.11, 0.28, -0.03, 0.15, 0.22, -0.11, 0.09, 0.33, -0.07, 0.14, 0.26, -0.21, 0.18, 0.29, -0.13, 0.06, 0.35, -0.08, 0.16, 0.23, -0.15, 0.12, 0.27, -0.22, 0.19, 0.32, -0.14, 0.07, 0.25, -0.18, 0.13, 0.30, -0.09, 0.17, 0.24, -0.16, 0.10, 0.34, -0.10, 0.20, 0.31, -0.23, 0.15, 0.28, -0.12, 0.11, 0.26, -0.19, 0.14, 0.29, -0.17, 0.08, 0.22, -0.20, 0.16, 0.27, -0.15, 0.09, 0.25, -0.21, 0.18, 0.30, -0.13, 0.07, 0.24, -0.22, 0.19, 0.32, -0.16, 0.10, 0.26, -0.18, 0.12, 0.28, -0.14, 0.06, 0.23, -0.19, 0.15, 0.29, -0.11, 0.05, 0.21, -0.17, 0.13, 0.27, -0.10, 0.04, 0.20, -0.15, 0.11, 0.25, -0.09, 0.03, 0.19, -0.13, 0.10, 0.24, -0.08, 0.02, 0.18, -0.12, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22, 0.05, -0.06, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, -0.08,-0.22], "k": 10, "num_candidates": 100 }, "fields": ["title"] }
FalconSeek ベクトルインデックスの使用方法の詳細については、「FalconSeek ベクトルインデックスユーザーガイド」をご参照ください。
仕組み
FalconSeek クラウドネイティブカーネルは、Elasticsearch の基盤となる Lucene コンポーネントの一部を、高度に最適化された C++ エンジンに置き換えます。クエリリクエストを送信すると、リクエストはまず FalconSeek プラグインレイヤーに到達します。このレイヤーは、クエリが FalconSeek エンジンで効率的に処理できるかどうかを判断します:
サポートされているクエリ:リクエストは、実行のために高性能な FalconSeek エンジンに転送されます。
サポートされていないクエリ:設定されたポリシーに基づき、システムは自動的にネイティブ Elasticsearch エンジンにフォールバックするか、エラーメッセージを返します。
この仕組みにより、互換性と安定性を維持しながら、高いパフォーマンスが保証されます。
よくある質問
Q:既存の Elasticsearch インスタンスで FalconSeek を有効にできますか?
A:いいえ、できません。FalconSeek は新規購入のインスタンスでのみ有効化できます。既存のインスタンスでこの機能を使用するには、互換性のある新しいインスタンスを作成し、Alibaba Cloud Data Transmission Service (DTS) や Logstash などのツールを使用してデータを移行する必要があります。
Q: FalconSeek がサポートしていないクエリを実行するとどうなりますか?
A: 結果はクエリ実行ポリシーによって決まります。デフォルトの native ポリシーでは、クエリは自動的にネイティブの Elasticsearch エンジンにフォールバックします。正しい結果は引き続き得られますが、FalconSeek によるパフォーマンスの高速化は行われません。native-direct ポリシーでは、システムはエラーメッセージを返します。