

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 vettoriale per Amazon DocumentDB
<a name="vector-search"></a>

La ricerca vettoriale è un metodo utilizzato nell'apprendimento automatico per trovare punti dati simili a un determinato punto dati confrontando le relative rappresentazioni vettoriali utilizzando metriche di distanza o somiglianza. Più i due vettori sono vicini nello spazio vettoriale, più simili sono considerati gli elementi sottostanti. Questa tecnica aiuta a catturare il significato semantico dei dati. Questo approccio è utile in varie applicazioni, come i sistemi di raccomandazione, l'elaborazione del linguaggio naturale e il riconoscimento delle immagini.

La ricerca vettoriale per Amazon DocumentDB combina la flessibilità e la ricca capacità di interrogazione di un database di JSON-based documenti con la potenza della ricerca vettoriale. Se desideri utilizzare i tuoi dati Amazon DocumentDB esistenti o una struttura flessibile dei dati dei documenti per creare casi d'uso di machine learning e intelligenza artificiale generativa, come esperienza di ricerca semantica, consigli sui prodotti, personalizzazione, chatbot, rilevamento di frodi e rilevamento di anomalie, la ricerca vettoriale per Amazon DocumentDB è la scelta ideale per te. La ricerca vettoriale è disponibile nei cluster basati su istanze Amazon DocumentDB 5.0.

**Topics**
+ [Inserimento di vettori](#w2aac23c23c11b9)
+ [Creazione di un indice vettoriale](#w2aac23c23c11c11)
+ [Ottenere una definizione dell'indice](#w2aac23c23c11c13)
+ [Query sui vettori](#w2aac23c23c11c15)
+ [Caratteristiche e limitazioni](#vector-limitations)
+ [Best practice](#w2aac23c23c11c19)

## Inserimento di vettori
<a name="w2aac23c23c11b9"></a>

Per inserire vettori nel tuo database Amazon DocumentDB, puoi utilizzare i metodi di inserimento esistenti: 

**Esempio**

Nell'esempio seguente, viene creata una raccolta di cinque documenti all'interno di un database di test. Ogni documento include due campi: il nome del prodotto e il corrispondente incorporamento vettoriale.

```
db.collection.insertMany([
  {"product_name": "Product A", "vectorEmbedding": [0.2, 0.5, 0.8]},
  {"product_name": "Product B", "vectorEmbedding": [0.7, 0.3, 0.9]},
  {"product_name": "Product C", "vectorEmbedding": [0.1, 0.2, 0.5]},
  {"product_name": "Product D", "vectorEmbedding": [0.9, 0.6, 0.4]},
  {"product_name": "Product E", "vectorEmbedding": [0.4, 0.7, 0.2]}
]);
```

## Creazione di un indice vettoriale
<a name="w2aac23c23c11c11"></a>

Amazon DocumentDB supporta i metodi di indicizzazione Hierarchical Navigable Small World (HNSW) e Inverted File with Flat Compression (IVFFlat). Un indice IVFFlat separa i vettori in elenchi e successivamente cerca un sottoinsieme selezionato di quegli elenchi più vicini al vettore di query. D'altra parte, un indice HNSW organizza i dati vettoriali in un grafico a più livelli. Sebbene HNSW abbia tempi di compilazione più lenti rispetto a IVFFlat, offre migliori prestazioni di interrogazione e richiamo. A differenza di IVFFlat, HNSW non prevede alcuna fase di addestramento e consente di generare l'indice senza alcun caricamento iniziale dei dati. Per la maggior parte dei casi d'uso, utilizzate il tipo di indice HNSW per la ricerca vettoriale.

Se non crei un indice vettoriale, Amazon DocumentDB esegue una ricerca esatta del vicino più prossimo, garantendo un richiamo perfetto. Tuttavia, negli scenari di produzione, la velocità è fondamentale. Utilizzate indici vettoriali, che potrebbero sostituire alcuni richiami con una maggiore velocità. È importante notare che l'aggiunta di un indice vettoriale può portare a risultati di ricerca diversi.

**Modelli**

Puoi utilizzare quanto segue `createIndex` o i `runCommand` modelli per creare un indice vettoriale su un campo vettoriale:

------
#### [ Using createIndex ]

In alcuni driver, come mongosh e Java, l'utilizzo dei `vectorOptions` parametri in `createIndex` potrebbe generare un errore. In questi casi, usa: `runCommand`

```
db.collection.createIndex(
  { "<vectorField>": "vector" },
  { "name": "<indexName>",
    "vectorOptions": {
      "type": " <hnsw> | <ivfflat> ",
      "dimensions": <number_of_dimensions>,
      "similarity": " <euclidean> | <cosine> | <dotProduct> ",
      "lists": <number_of_lists> [applicable for IVFFlat],
      "m": <max number of connections> [applicable for HNSW],
      "efConstruction": <size of the dynamic list for index build> [applicable for HNSW]
    }
  }
);
```

------
#### [ Using runCommand ]

In alcuni driver, come mongosh e Java, l'utilizzo dei `vectorOptions` parametri in `createIndex` potrebbe generare un errore. In questi casi, usa: `runCommand`

```
db.runCommand(
  { "createIndexes": "<collection>", 
  "indexes": [{
      key: { "<vectorField>": "vector" },
      vectorOptions: {
          type: " <hnsw> | <ivfflat> ",
          dimensions: <number of dimensions>,
          similarity: " <euclidean> | <cosine> | <dotProduct> ",
          lists: <number_of_lists> [applicable for IVFFlat],
          m: <max number of connections> [applicable for HNSW],
          efConstruction: <size of the dynamic list for index build> [applicable for HNSW]
          },
      name: "myIndex" 
      }] 
  }
);
```

------


| Parametro | Requisito | Tipo di dati | Description | Valore/i | 
| --- | --- | --- | --- | --- | 
| **name** | facoltativo | stringa | Specifica il nome dell'indice. | Carattere alfanumerico | 
| **type** | facoltativo |  | Specifica il tipo di indice. | Supportato: hnsw o ifflat<br />Predefinito: HNSW (patch del motore 3.0.4574 in poi) | 
| **dimensions** | obbligatorio | intero | Specifica il numero di dimensioni nei dati vettoriali. | Massimo 2.000 dimensioni. | 
| **similarity** | obbligatorio | stringa | Specifica la metrica della distanza utilizzata per il calcolo della somiglianza. |  + **euclidean**<br />+ **cosine**<br />+ **dotProduct**  | 
| **lists** | obbligatorio per IVFFlat | intero | Specifica il numero di cluster utilizzati dall'indice IVFFlat per raggruppare i dati vettoriali. L'impostazione consigliata è il numero di documents/1000 per un massimo di 1 milione di documenti e per oltre 1 milione di documenti. `sqrt(# of documents)` | Minimo: 1<br />Numero massimo: consulta la tabella degli elenchi per tipo di istanza riportata di seguito. [Caratteristiche e limitazioni](#vector-limitations) | 
| **m** | facoltativo | intero | Specifica il numero massimo di connessioni per un indice HNSW | Impostazione predefinita: 16<br />Intervallo [2, 100] | 
| **efConstruction** | facoltativo | intero | Specifica la dimensione dell'elenco dinamico di candidati per la costruzione del grafico per l'indice HNSW.<br />`efConstruction`deve essere maggiore o uguale a (2 \* m) | Impostazione predefinita: 64<br />Intervallo [4, 1000] | 

È importante impostare il valore dei sottoparametri come `lists` per IVFFlat `m` e `efConstruction` per HNSW in modo appropriato poiché influirà sui tempi di compilazione e sulle prestazioni della accuracy/recall ricerca. Un valore di elenco più elevato aumenta la velocità dell'interrogazione in quanto riduce il numero di vettori in ogni elenco, con conseguente riduzione delle aree. Tuttavia, una regione di dimensioni inferiori può comportare un maggior numero di errori di richiamo, con conseguente minore precisione. Per HNSW, l'aumento del valore `m` e della precisione, ma `efConstruction` aumenta anche il tempo e le dimensioni di creazione dell'indice. Fare riferimento agli esempi riportati di seguito:

**Esempi**

------
#### [ HNSW ]

```
db.collection.createIndex(
  { "vectorEmbedding": "vector" },
  { "name": "myIndex",
    "vectorOptions": {
      "type": "hnsw",
      "dimensions": 3,
      "similarity": "euclidean",
      "m": 16,
      "efConstruction": 64
    }
  }
);
```

------
#### [ IVFFlat ]

```
db.collection.createIndex(
  { "vectorEmbedding": "vector" },
  { "name": "myIndex",
    "vectorOptions": {
      "type": "ivfflat",
      "dimensions": 3,
      "similarity": "euclidean",
      "lists":1
    }
  }
)
```

------

## Ottenere una definizione dell'indice
<a name="w2aac23c23c11c13"></a>

Puoi visualizzare i dettagli dei tuoi indici, inclusi gli indici vettoriali, usando il comando: `getIndexes`

**Esempio**

```
db.collection.getIndexes()
```

**Output di esempio**

```
[
 {
  "v" : 4,
  "key" : {
   "_id" : 1
  },
  "name" : "_id_",
  "ns" : "test.collection"
 },
 {
  "v" : 4,
  "key" : {
   "vectorEmbedding" : "vector"
  },
  "name" : "myIndex",
  "vectorOptions" : {
   "type" : "ivfflat",
   "dimensions" : 3,
   "similarity" : "euclidean",
   "lists" : 1
  },
  "ns" : "test.collection"
 }
]
```

## Query sui vettori
<a name="w2aac23c23c11c15"></a>

Amazon DocumentDB supporta due operatori di ricerca vettoriale per interrogare i vettori:

### Operatore di ricerca vettoriale classico
<a name="w2aac23c23c11c15b5"></a>

Usa il seguente modello per interrogare un vettore:

```
db.collection.aggregate([
  {
    $search: {
      "vectorSearch": {
        "vector": <query vector>, 
        "path": "<vectorField>", 
        "similarity": "<distance metric>",
        "k": <number of results>,
        "probes":<number of probes> [applicable for IVFFlat],
        "efSearch":<size of the dynamic list during search> [applicable for HNSW]
      }
    }
  }
]);
```


| Parametro | Requisito | Tipo | Description | Valore/i | 
| --- | --- | --- | --- | --- | 
| **vectorSearch** | obbligatorio | operatore | Utilizzato all'interno del comando $search per interrogare i vettori. |  | 
| **vector** | obbligatorio | array | Indica il vettore di interrogazione che verrà utilizzato per trovare vettori simili. |  | 
| **path** | obbligatorio | stringa | Definisce il nome del campo vettoriale. |  | 
| **k** | obbligatorio | intero | Specifica il numero di risultati restituiti dalla ricerca. |  | 
| **similarity** | obbligatorio | stringa | Specifica la metrica della distanza utilizzata per il calcolo della somiglianza. |  + **euclidean**<br />+ **cosine**<br />+ **dotProduct**  | 
| **probes** | facoltativo | intero | Il numero di cluster che desideri ispezionare con la ricerca vettoriale. Un valore più alto offre un migliore richiamo a scapito della velocità. Può essere impostato sul numero di elenchi per la ricerca esatta del vicino più vicino (a quel punto il planner non utilizzerà l'indice). L'impostazione consigliata per iniziare la messa a punto è. `sqrt(# of lists)` | Impostazione predefinita: 1 | 
| **efSearch** | facoltativo | intero | Specifica la dimensione dell'elenco dinamico di candidati utilizzato dall'indice HNSW durante la ricerca. Un valore più elevato di `efSearch` consente un migliore richiamo a discapito della velocità. | Impostazione predefinita: 40<br />Intervallo [1, 1000] | 

È importante regolare con precisione il valore di `efSearch` (HNSW) o `probes` (IVFFlat) per ottenere le prestazioni e la precisione desiderate. Vedi i seguenti esempi di operazioni:

------
#### [ HNSW ]

```
db.collection.aggregate([
  {
    $search: {
      "vectorSearch": {
        "vector": [0.2, 0.5, 0.8], 
        "path": "vectorEmbedding", 
        "similarity": "euclidean",
        "k": 2,
        "efSearch": 40
      }
    }
  }
]);
```

------
#### [ IVFFlat ]

```
db.collection.aggregate([
  {
    $search: {
      "vectorSearch": {
        "vector": [0.2, 0.5, 0.8], 
        "path": "vectorEmbedding", 
        "similarity": "euclidean",
        "k": 2,
        "probes": 1
      }
    }
  }
]);
```

------

**Output di esempio**

L'aspetto dell'output di questa operazione è simile al seguente.

```
{ "_id" : ObjectId("653d835ff96bee02cad7323c"), "product_name" : "Product A", "vectorEmbedding" : [ 0.2, 0.5, 0.8 ] }
{ "_id" : ObjectId("653d835ff96bee02cad7323e"), "product_name" : "Product C", "vectorEmbedding" : [ 0.1, 0.2, 0.5 ] }
```

### ``operatore $vectorSearch (disponibile in Amazon DocumentDB 8.0 e versioni successive)
<a name="w2aac23c23c11c15b7"></a>

Usa il seguente modello per interrogare un vettore:

```
db.collection.aggregate([
{
  "$vectorSearch": {
    "exact": true | false,
    "index": "<index-name>" [supports only HNSW index],
    "limit": <number-of-results> [same as k],
    "path": "<vector field-to-search>",
    "queryVector": <array-of-numbers>,
    "numCandidates": <number-of-candidates> [same as efSearch], 
  }
}])
```

## Caratteristiche e limitazioni
<a name="vector-limitations"></a>

**Compatibilità delle versioni **
+ La ricerca vettoriale per Amazon DocumentDB è disponibile solo sui cluster basati su istanze Amazon DocumentDB 5.0\+.

**Vettori **
+ Amazon DocumentDB può indicizzare vettori fino a 2.000 dimensioni. Tuttavia, è possibile memorizzare fino a 16.000 dimensioni senza un indice.

**Indici**
+ Per la creazione dell'indice IVFFlat, l'impostazione consigliata per il parametro degli elenchi è il numero di documenti per un massimo di 1 milione e documents/1000 `sqrt(# of documents)` per oltre 1 milione di documenti. A causa di un limite di memoria di lavoro, Amazon DocumentDB supporta un determinato valore massimo del parametro degli elenchi in base al numero di dimensioni. A titolo di riferimento, la seguente tabella fornisce i valori massimi dei parametri delle liste per vettori di 500, 1000 e 2.000 dimensioni:    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/it_it/documentdb/latest/devguide/vector-search.html)
+ Nessun'altra opzione di indice come `compound` `sparse` o è supportata con `partial` gli indici vettoriali.
+ La creazione parallela dell'indice non è supportata per l'indice HNSW in Amazon DocumentDB 5.0.

**Query vettoriale **
+ Per le query di ricerca vettoriale, è importante ottimizzare i parametri, ad esempio `probes` `efSearch` per ottenere risultati ottimali. Maggiore è il valore del `efSearch` parametro `probes` o, maggiore è il richiamo e minore è la velocità. L'impostazione consigliata per iniziare la regolazione fine del parametro delle sonde è. `sqrt(# of lists)` 

## Best practice
<a name="w2aac23c23c11c19"></a>

Scopri le best practice per lavorare con la ricerca vettoriale in Amazon DocumentDB. Questa sezione viene continuamente aggiornata man mano che vengono identificate nuove best practice.
+ La creazione dell'indice Inverted File with Flat Compression (IVFFlat) prevede il clustering e l'organizzazione dei punti dati in base alle somiglianze. Affinché un indice sia più efficace, carica alcuni dati prima di creare l'indice.
+ Per le query di ricerca vettoriale, è importante ottimizzare i parametri, ad esempio `probes` `efSearch` per ottenere risultati ottimali. Maggiore è il valore del `efSearch` parametro `probes` or, maggiore è il richiamo e minore è la velocità. L'impostazione consigliata per iniziare la regolazione fine del `probes` parametro è`sqrt(lists)`. 

**Risorse**
+ [La ricerca vettoriale per Amazon DocumentDB è ora disponibile a livello generale ](https://aws.amazon.com/blogs/aws/vector-search-for-amazon-documentdb-with-mongodb-compatibility-is-now-generally-available) sul blog AWS 
+ [Esempio di codice di ricerca semantica ](https://github.com/aws-samples/amazon-documentdb-samples/tree/master/blogs/semanticsearch-docdb)
+ [Esempi di codice di ricerca vettoriale di Amazon DocumentDB ](https://github.com/aws-samples/amazon-documentdb-samples/tree/master/samples/vector-search)