

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon OpenSearch Service での K 最近傍 (k-NN) 検索
<a name="knn"></a>

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

**注記**  
このドキュメントでは、k-NN プラグインの概要と、マネージド OpenSearch Service でプラグインを使用する場合の制限について説明します。簡易および複雑な例、パラメータリファレンス、完全な API リファレンスなど、k-NN プラグインの包括的なドキュメントについては、オープンソースの「[OpenSearch ドキュメント](https://opensearch.org/docs/latest/search-plugins/knn/index/)」を参照してください。このドキュメントでは、パフォーマンス調整と k-NN 固有のクラスター設定についても説明されています。

## k-NN を用いた開始方法
<a name="knn-gs"></a>

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
      }
    }
  }
}
```

最適なパフォーマンスを維持しながら大量のクエリを処理する必要がある場合は、[https://opensearch.org/docs/latest/api-reference/multi-search/](https://opensearch.org/docs/latest/api-reference/multi-search/) API を使用して JSON を使用して一括検索を作成し、1 つのリクエストを送信して複数の検索を実行できます。

```
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 クエリの一括ベクトル検索を設定する方法を示しています。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/Umi67JCfCbU/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/Umi67JCfCbU)


## k-NN の違い、チューニング、および制限
<a name="knn-settings"></a>

OpenSearch では、`_cluster/settings` APIを使用してすべての [k-NN の設定](https://docs.opensearch.org/latest/vector-search/settings/)を変更できます。OpenSearch Service では、`knn.memory.circuit_breaker.enabled` および `knn.circuit_breaker.triggered` 以外のすべての設定を変更できます。k-NN 統計は、[Amazon CloudWatch メトリクス](managedomains-cloudwatchmetrics.md)として含まれています。

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

バージョン 2.x 以降で作成された k-NN インデックスを、バージョン 2.17 以降のドメインの [UltraWarm](ultrawarm.md) または [コールドストレージ](cold-storage.md) に移行できます。

k-NN インデックスのクリアキャッシュ API とウォームアップ API は、ウォームインデックスに対してブロックされます。インデックスの最初のクエリが開始されると、Amazon S3 からグラフファイルをダウンロードし、グラフをメモリにロードします。同様に、グラフの TTL の有効期限が切れると、ファイルは自動的にメモリから削除されます。