

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Ricerca K-Nearest Neighbor (k-NN) su Amazon Service OpenSearch
<a name="knn"></a>

Acronimo dell'algoritmo *k-Nearest Neighbors* associato, k-NN for OpenSearch Amazon Service consente di cercare punti in uno spazio vettoriale e trovare i «vicini più vicini» per tali punti in base alla distanza euclidea o alla somiglianza del coseno. Nei casi d'uso sono inclusi suggerimenti (ad esempio, una funzionalità "altri brani che potrebbero piacerti" in un'applicazione musicale), il riconoscimento delle immagini e il rilevamento delle frodi.

**Nota**  
Questa documentazione fornisce una breve panoramica del plug-in k-NN, oltre alle limitazioni relative all'utilizzo del plug-in con un servizio gestito. OpenSearch [Per una documentazione completa del plugin k-NN, inclusi esempi semplici e complessi, riferimenti ai parametri e il riferimento completo all'API, consulta la documentazione open source. OpenSearch ](https://opensearch.org/docs/latest/search-plugins/knn/index/) La documentazione open source copre anche l'ottimizzazione delle prestazioni e k-NN-specific le impostazioni del cluster. 

## Nozioni di base su k-NN
<a name="knn-gs"></a>

Per utilizzare k-NN, è necessario creare un indice con l'impostazione `index.knn` e aggiungere uno o più campi del tipo di dati `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
      }
    }
  }
}
```

Il tipo di dati `knn_vector` supporta un singolo elenco di fino a 10.000 numeri in virgola mobile, con il numero di numeri in virgola mobile definito dal parametro `dimension` richiesto. Dopo aver creato l'indice, aggiungi alcuni dati.

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

Quindi puoi cercare i dati utilizzando il tipo di query `knn`.

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

In questo caso, `k` è il numero di neighbors che la query deve restituire, ma è necessario includere anche l'opzione `size`. In caso contrario, vengono ottenuti i risultati `k` per ogni partizione (e ogni segmento) anziché i risultati `k` per l'intera query. k-NN supporta un valore massimo di `k` pari a 10.000.

Se si combina la query `knn` con altre clausole, è possibile che vengano restituiti meno risultati `k`. In questo esempio, la clausola `post_filter` riduce il numero di risultati da 2 a 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
      }
    }
  }
}
```

Se devi gestire un grande volume di query mantenendo prestazioni ottimali, puoi utilizzare l'[https://opensearch.org/docs/latest/api-reference/multi-search/](https://opensearch.org/docs/latest/api-reference/multi-search/)API per creare una ricerca di massa con JSON e inviare una singola richiesta per eseguire più ricerche:

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

Il video seguente mostra come configurare ricerche vettoriali di massa per le query 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)


## Differenze, regolazione e limitazioni di k-NN
<a name="knn-settings"></a>

OpenSearch consente di modificare tutte le [impostazioni k-NN utilizzando](https://docs.opensearch.org/latest/vector-search/settings/) l'API. `_cluster/settings` In OpenSearch Service, puoi modificare tutte le impostazioni tranne `knn.memory.circuit_breaker.enabled` e`knn.circuit_breaker.triggered`. Le statistiche k-NN sono incluse come metriche di [Amazon CloudWatch ](managedomains-cloudwatchmetrics.md).

In particolare, confronta la `KNNGraphMemoryUsage` metrica su ciascun nodo di dati con la `knn.memory.circuit_breaker.limit` statistica e la RAM disponibile per il tipo di istanza. OpenSearch Il servizio utilizza metà della RAM di un'istanza per l'heap Java (fino a una dimensione dell'heap di 32 GiB). Per impostazione predefinita, k-NN utilizza fino al 50% della metà rimanente, quindi un tipo di istanza con 32 GiB di RAM può ospitare 8 GiB di grafici (32 \$1 0,5 \$1 0,5). Le prestazioni possono risentirne se l'utilizzo della memoria grafica supera questo valore.

È possibile migrare un indice k-NN creato nella versione 2.x o successiva o [archiviare a freddo](cold-storage.md) su un dominio con la versione 2.17 [UltraWarm](ultrawarm.md)o successiva.

Le API Clear cache e le API di riscaldamento per gli indici k-NN sono bloccate per gli indici caldi. Quando viene avviata la prima query per l'indice, scarica i file grafici da Amazon S3 e lo carica in memoria. Allo stesso modo, quando il TTL è scaduto per i grafici, i file vengono automaticamente rimossi dalla memoria.