Alibaba Cloud Elasticsearch のベクトルエンジンは、大規模なベクトルデータを処理します。Elasticsearch の強力な検索機能とベクトル類似度計算を組み合わせています。推奨システム、画像検索、自然言語処理などに使用できます。この Topic では、Alibaba Cloud Elasticsearch ベクトルエンジンを効率的に使用する方法とベストプラクティスについて説明します。ベクトルエンジンは定期的に更新されます。最適なパフォーマンス、コスト効率、ユーザーエクスペリエンスを実現するために、Alibaba Cloud Elasticsearch の最新バージョンを使用してください。
前提条件
ES インスタンスが作成済みであること。インスタンスをまだ作成していない場合は、「クイックスタート:インスタンスの作成からデータ取得まで」をご参照のうえ、最新バージョンの Alibaba Cloud ES 8.x インスタンスを作成してください。
ベクトルエンジンは、大量のオフヒープメモリを使用してベクトルインデックスをキャッシュします。適切なデータノードの仕様と数を選択するには、この Topic の後半にあるメモリ計算ガイダンスを使用して、オフヒープメモリの使用量を見積もってください。
操作手順
1. インデックスの作成
ベクトルデータストレージをサポートするインデックスを作成します。以下にインデックス定義の例を示します。
PUT /my_vector_index
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"my_vector": {
"type": "dense_vector",
"dims": 3
},
"my_text" : {
"type" : "keyword"
}
}
}
}number_of_shardsとnumber_of_replicasの設定は、データ量とパフォーマンス要件によって異なります。ベクトルデータを格納するには、
dense_vectorフィールドタイプを使用します。dimsパラメーターをベクトルディメンションに設定します。dense_vector フィールドタイプには多くのパラメーターがあります。詳細については、「Dense vector field type」をご参照ください。
2. データのインポート
Bulk API などのメソッドを使用して、Elasticsearch ベクトルインデックスにデータをインポートします。以下に例を示します。
PUT my_vector_index/_doc/1
{
"my_text" : "text1",
"my_vector" : [0.5, 10, 6]
}
PUT my_vector_index/_doc/2
{
"my_text" : "text2",
"my_vector" : [-0.5, 10, 10]
}ベクトルディメンションがインデックスで定義されたディメンションと一致することを確認してください。
3. ベクトル検索の実行
Elasticsearch のベクトル類似検索を使用して、クエリベクトルを指定することで最も類似したドキュメントを検索します。以下にクエリの例を示します。
GET my_vector_index/_search
{
"knn": {
"field": "my_vector",
"query_vector": [-5, 9, -12],
"k": 10,
"num_candidates": 100
},
"fields": [ "my_text" ]
}パラメーター | 内容 |
| (任意) 返される最近傍の数。この値は num_candidates 以下である必要があります。デフォルトでは、 |
| (任意) 各シャードで考慮される最近傍候補の数。このパラメーターは、パフォーマンスと取得率に大きな影響を与えます。 |
このセクションでは、k および num_candidates パラメーターについて説明します。HNSW において、num_candidates はクエリの ef 値を指し、各シャード内で収集される num_candidates 個の最近傍ドキュメントを表します。一方、k は Elasticsearch が最終結果で返すドキュメントの数です。
ベクトル検索の追加機能は次のとおりです。
knnクエリは、filter、一致するdocの最小scoreを設定するためのsimilarityパラメーター、およびnestedフィールドをサポートします。複数の
knnフィールドを一度にクエリすることをサポートします。scriptを使用した正確なknnクエリをサポートします。scriptを使用したrescoreをサポートします。機能の完全なリストについては、「k-nearest neighbor (knn) search」をご参照ください。