Elasticsearch は、複雑な集約クエリ、高カーディナリティのタームクエリ、ベクター検索を処理する際にパフォーマンスのボトルネックに直面する可能性があります。Alibaba 独自の Havenask エンジンを基盤とする FalconSeek クラウドネイティブカーネルは、C++ カラムナーメモリと完全非同期フレームワークを使用して、Elasticsearch エコシステムとの完全な互換性を維持しながら、クエリパフォーマンスを大幅に向上させます。本ドキュメントでは、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 の有効化
-
インデックスを作成するときは、
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 を使用してインデックス設定を更新し、FalconSeek を動的に有効化します。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 戦略を使用するものとします。特定のクエリで Elasticsearch ネイティブエンジンを強制的に使用するには、リクエストに havenask_search_type パラメーターを追加します。
-
方法 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 は、既存の Elasticsearch インデックス構造の上に C++ ベースのベクターインデックスを追加します。この独自のベクターインデックスは Alibaba によって開発され、Taobao や Tmall での検索、レコメンデーション、逆引き画像検索など、Alibaba Group 全体のコアサービスを支えています。FalconSeek クラウドネイティブカーネルの高性能ベクターインデックスを使用して、逆引き画像検索やセマンティック検索などの効率的な AI アプリケーションを構築します。
-
ベクターインデックスを作成します。
mappingsで、画像またはテキストのベクターを格納するために、image_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 を有効にできるのは 新規購入のインスタンス のみです。既存のインスタンスの場合は、新しい準拠インスタンスを作成し、Data Transmission Service (DTS) や Logstash などのツールを使用してデータを移行することを推奨します。
Q:FalconSeek がサポートしていないクエリを実行するとどうなりますか?
A: それはクエリ実行戦略によって異なります。デフォルトの native モードでは、クエリは自動的に Elasticsearch ネイティブエンジンにフォールバックします。正しい結果は得られますが、FalconSeek によるパフォーマンスの高速化は行われません。native-direct モードでは、システムはエラーを返します。