翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon OpenSearch Service での k-Narest Neighbor (k-NN) 検索
関連付けられた K 最近傍アルゴリズムの略で、Amazon OpenSearch Service の k-NN を使用すると、ベクトル空間内のポイントを検索し、ユークリッド距離またはコサイン類似度でそれらのポイントの「最近傍」を見つけることができます。ユースケースには、推奨 (音楽アプリケーションの「おすすめの曲」機能など)、画像認識、不正行為の検出などがあります。
注記
このドキュメントでは、 OpenSearch サービスと k-NN プラグインのさまざまなバージョン間のバージョン互換性、および マネージド OpenSearch サービスでプラグインを使用する場合の制限について説明します。シンプルな例と複雑な例、パラメータリファレンス、プラグインの完全な API リファレンスなど、k-NN OpenSearch
次の表を使用して、Amazon OpenSearch Service ドメインで実行されている k-NN プラグインのバージョンを確認します。各 k-NN プラグインバージョンは、 OpenSearch
OpenSearch | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
OpenSearch バージョン | k-NN プラグインバージョン | 注目すべき機能 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.13 | 2.13.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.11 | 2.11.0.0 |
k-NN クエリ内の |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.9 | 2.9.0.0 | Faiss |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.7 | 2.7.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.5 | 2.5.0.0 | k-NN モデルシステムインデックス SystemIndexPlugin 用に拡張、コア HybridFS に Lucene 固有のファイル拡張を追加 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.3 | 2.3.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.3 | 1.3.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.2 | 1.2.0.0 | Faiss |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.1 | 1.1.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.0 |
1.0.0.0 |
下位互換性をサポートしながらREST APIの名前が変更され、opendistro から opensearch に名前空間の名前が変更されます |
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 を用いた開始方法
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 } } } }
最適なパフォーマンスを維持しながら大量のクエリを処理する必要がある場合は、_msearch
GET _msearch { "index": "my-index"} { "query": { "knn": {"my_vector2":{"vector": [2, 3, 5, 6],"k":2 }} } } { "index": "my-index", "search_type": "dfs_query_then_fetch"} { "query": { "knn": {"my_vector1":{"vector": [2, 3],"k":2 }} } }
次の動画は、K-NN クエリの一括ベクトル検索を設定する方法を示しています。
k-NN の違い、チューニング、および制限
OpenSearch では、 _cluster/settings
API を使用してすべての k-NN 設定を変更knn.memory.circuit_breaker.enabled
と を除くすべての設定を変更できますknn.circuit_breaker.triggered
。k-NN 統計は Amazon CloudWatch メトリクス として含まれます。
特に、各データノードの KNNGraphMemoryUsage
メトリクスを knn.memory.circuit_breaker.limit
統計とインスタンスタイプの使用可能な RAM と照らし合わせて確認します。 OpenSearch サービスは Java ヒープにインスタンスの RAM の半分を使用します (ヒープサイズは 32 GiB まで)。デフォルトでは、k-NN は残りの半分の 50% まで使用するため、32 GiB の RAM を持つインスタンスタイプは 8 GiB のグラフに対応できます (32 * 0.5 * 0.5)。グラフのメモリ使用量がこの値を超えると、パフォーマンスが低下する可能性があります。
インデックスがおおよその k-NN () を使用している場合、k-NN"index.knn": true
。index.knn
が false
(k-NN