

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Pencarian K-Nearest Neighbor (K-nN) di Layanan Amazon OpenSearch
<a name="knn"></a>

Kependekan dari algoritma *tetangga k-terdekat* yang terkait, k-NN untuk Amazon OpenSearch Service memungkinkan Anda mencari titik dalam ruang vektor dan menemukan “tetangga terdekat” untuk titik-titik tersebut berdasarkan jarak Euclidean atau kesamaan kosinus. Kasus penggunaan mencakup rekomendasi (misalnya, fitur "lagu lain yang mungkin Anda sukai" di aplikasi musik), pengenalan citra, dan deteksi penipuan.

**catatan**  
Dokumentasi ini memberikan gambaran singkat tentang plugin K-NN, serta batasan saat menggunakan plugin dengan Layanan terkelola OpenSearch . [Untuk dokumentasi komprehensif plugin K-NN, termasuk contoh sederhana dan kompleks, referensi parameter, dan referensi API lengkap, lihat dokumentasi open sourceOpenSearch .](https://opensearch.org/docs/latest/search-plugins/knn/index/) Dokumentasi open source juga mencakup tuning kinerja dan pengaturan k-NN-specific cluster. 

## Memulai dengan k-NN
<a name="knn-gs"></a>

Untuk menggunakan k-NN, Anda harus membuat indeks dengan `index.knn` pengaturan dan menambahkan satu atau beberapa bidang tipe data `knn_vector`.

```
PUT my-index

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

Tipe data `knn_vector` mendukung daftar tunggal hingga 10.000 float, dengan jumlah float didefinisikan oleh parameter `dimension` yang diperlukan. Setelah Anda membuat indeks, tambahkan beberapa data untuk itu.

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

Kemudian Anda dapat mencari data dengan menggunakan tipe kueri `knn`. 

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

Dalam kasus ini, `k` adalah jumlah tetangga yang ingin Anda kueri agar kembali, tetapi Anda juga harus menyertakan opsi `size`. Jika tidak, Anda mendapatkan hasil `k` untuk setiap serpihan (dan setiap segmen) dan bukan hasil `k` untuk seluruh kueri. k-NN mendukung nilai `k` maksimal sebesar 10.000.

Jika Anda mencampur kueri `knn` dengan klausa lain, Anda mungkin menerima lebih sedikit dari hasil `k`. Dalam contoh ini, klausa `post_filter` mengurangi jumlah hasil dari 2 ke 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
      }
    }
  }
}
```

Jika Anda perlu menangani sejumlah besar kueri sambil mempertahankan kinerja optimal, Anda dapat menggunakan [https://opensearch.org/docs/latest/api-reference/multi-search/](https://opensearch.org/docs/latest/api-reference/multi-search/)API untuk membuat penelusuran massal dengan JSON dan mengirim satu permintaan untuk melakukan beberapa pencarian:

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

Video berikut menunjukkan cara mengatur pencarian vektor massal untuk kueri K-NN.

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


## Perbedaan, penyetelan, dan batasan K-nn
<a name="knn-settings"></a>

OpenSearch memungkinkan Anda memodifikasi semua [pengaturan K-nn](https://docs.opensearch.org/latest/vector-search/settings/) menggunakan API. `_cluster/settings` Pada OpenSearch Layanan, Anda dapat mengubah semua pengaturan kecuali `knn.memory.circuit_breaker.enabled` dan`knn.circuit_breaker.triggered`. Statistik k-NN disertakan sebagai metrik [Amazon CloudWatch ](managedomains-cloudwatchmetrics.md).

Secara khusus, periksa `KNNGraphMemoryUsage` metrik pada setiap node data terhadap `knn.memory.circuit_breaker.limit` statistik dan RAM yang tersedia untuk jenis instance. OpenSearch Layanan menggunakan setengah dari RAM instance untuk heap Java (hingga ukuran heap 32 GiB). Secara default, k-NN menggunakan hingga 50% dari separuh yang tersisa, jadi tipe instans dengan 32 GiB RAM dapat menampung 8 GiB grafik (32 \* 0.5 \* 0.5). Performa dapat dirugikan jika penggunaan memori grafik melebihi nilai ini.

Anda dapat memigrasikan indeks K-NN yang dibuat pada versi 2.x atau yang lebih baru ke [UltraWarm](ultrawarm.md)atau [penyimpanan dingin](cold-storage.md) pada domain dengan versi 2.17 atau yang lebih baru.

Clear cache api dan warmup apis untuk indeks k-NN diblokir untuk indeks hangat. Ketika kueri pertama dimulai untuk indeks, ia mengunduh file grafik dari Amazon S3 dan memuat grafik ke memori. Demikian pula, ketika TTL kedaluwarsa untuk grafik, file secara otomatis dikeluarkan dari memori.