Amazon OpenSearch Service での K 最近傍 (k-NN) 検索 - Amazon OpenSearch Service

Amazon OpenSearch Service での K 最近傍 (k-NN) 検索

関連する K 最近傍アルゴリズムでは、Amazon OpenSearch Service 用 k-NN を使用すると、ベクトル空間内のポイントを検索し、ユークリッド距離またはコサイン類似度によってそれらのポイントの「最近傍」を見つけることができます。ユースケースには、推奨 (音楽アプリケーションの「あなたにおすすめの曲」機能など)、画像認識、不正行為の検出などがあります。

Amazon OpenSearch Service ドメインで実行されている k-NN プラグインのバージョンを確認するには、次のテーブルを参照してください。各 k-NN プラグインのバージョンは、OpenSearch または Elasticsearch バージョンに対応しています。

OpenSearch
OpenSearch バージョン k-NN プラグインバージョン 注目すべき機能
1.0

1.0.0.0

下位互換性をサポートしながらREST APIの名前が変更され、opendistro から opensearch に名前空間の名前が変更されます
1.1 1.1.0.0
1.2 1.2.0.0 Faiss ライブラリのサポートを追加
Elasticsearch
Elasticsearch バージョン k-NN プラグインバージョン 注目すべき機能
7.1

1.3.0.0

ユークリッド距離
7.4

1.4.0.0

7.7

1.8.0.0

コサイン類似度
7.8

1.9.0.0

7.9

1.11.0.0

ウォームアップ API、カスタムスコアリング

7.10

1.13.0.0

ハミング距離、L1 ノルム距離、ペインレススクリプティング

k-NN プラグインの詳細なドキュメントは、「OpenSearch ドキュメント」で入手可能です。k 最近傍アルゴリズムの背景情報については、Wikipedia を参照してください。

k-NN を用いた開始方法

k-NN を使用するには、index.knn 設定でインデックスを作成し、knn_vector データ型の 1 つ以上のフィールドを追加する必要があります。

PUT my-index { "settings": { "index.knn": true }, "mappings": { "properties": { "my_vector1": { "type": "knn_vector", "dimension": 2 }, "my_vector2": { "type": "knn_vector", "dimension": 4 } } } }

knn_vector データ型は、必要な dimension パラメータによって定義された浮動小数点数とともに、10,000 個までの浮動小数点数の単一のリストをサポートします。インデックスを作成したら、そのインデックスにデータを追加します。

POST _bulk { "index": { "_index": "my-index", "_id": "1" } } { "my_vector1": [1.5, 2.5], "price": 12.2 } { "index": { "_index": "my-index", "_id": "2" } } { "my_vector1": [2.5, 3.5], "price": 7.1 } { "index": { "_index": "my-index", "_id": "3" } } { "my_vector1": [3.5, 4.5], "price": 12.9 } { "index": { "_index": "my-index", "_id": "4" } } { "my_vector1": [5.5, 6.5], "price": 1.2 } { "index": { "_index": "my-index", "_id": "5" } } { "my_vector1": [4.5, 5.5], "price": 3.7 } { "index": { "_index": "my-index", "_id": "6" } } { "my_vector2": [1.5, 5.5, 4.5, 6.4], "price": 10.3 } { "index": { "_index": "my-index", "_id": "7" } } { "my_vector2": [2.5, 3.5, 5.6, 6.7], "price": 5.5 } { "index": { "_index": "my-index", "_id": "8" } } { "my_vector2": [4.5, 5.5, 6.7, 3.7], "price": 4.4 } { "index": { "_index": "my-index", "_id": "9" } } { "my_vector2": [1.5, 5.5, 4.5, 6.4], "price": 8.9 }

次に、knn クエリタイプを使用してデータを検索できます。

GET my-index/_search { "size": 2, "query": { "knn": { "my_vector2": { "vector": [2, 3, 5, 6], "k": 2 } } } }

この場合、k はクエリが返す最近傍の数ですが、size オプションも含める必要があります。それ以外の場合は、クエリ全体の k 結果ではなく、各シャード (および各セグメント) の k 結果が返されます。k-NN は、最大 10,000 の k 値をサポートします。

knn クエリを他の句と混在させると、返される結果は k の結果よりも少なくなる場合があります。この例では、post_filter 句を使用することにより、結果の数が 2 から 1 に減ります。

GET my-index/_search { "size": 2, "query": { "knn": { "my_vector2": { "vector": [2, 3, 5, 6], "k": 2 } } }, "post_filter": { "range": { "price": { "gte": 6, "lte": 10 } } } }

k-NN の違いとチューニング

OpenSearch では、_cluster/settings APIを使用してすべての k-NN の設定を変更できます。OpenSearch Service では、knn.memory.circuit_breaker.enabled および knn.circuit_breaker.triggered 以外のすべての設定を変更できます。k-NN 統計は、Amazon CloudWatch メトリクスとして含まれています。

特に、knn.memory.circuit_breaker.limit 統計情報およびインスタンスタイプに使用可能な RAM に対して、各データノードの KNNGraphMemoryUsage メトリクスを確認できます。OpenSearch Service は、インスタンスの RAM の半分を Java ヒープ (32 GiB のヒープサイズまで) に使用します。デフォルトでは、k-NN は残りの半分の 50% まで使用するため、32 GiB の RAM を持つインスタンスタイプは 8 GiB のグラフに対応できます (32 * 0.5 * 0.5)。グラフのメモリ使用量がこの値を超えると、パフォーマンスが低下する可能性があります。