Ricerca k-Nearest Neighbor (k-NN) in Amazon OpenSearch Service - Amazon OpenSearch Service

Ricerca k-Nearest Neighbor (k-NN) in Amazon OpenSearch Service

Abbreviazione dell'algoritmo k-nearest neighbors associato, k-NN per Amazon OpenSearch Service consente di cercare i punti in uno spazio vettoriale e trovare i "vicini più vicini" per quei punti in base alla distanza euclidea o alla similitudine di 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.

Utilizzare le tabelle seguenti per trovare la versione del plugin k-NN in esecuzione sul dominio Amazon OpenSearch Service. Ogni versione del plugin k-NN corrisponde a una versione di OpenSearch o Elasticsearch.

OpenSearch
Versione OpenSearch Versione plug-in k-NN Caratteristiche da tenere in considerazione
1.0

1.0.0.0

Le API REST rinominate, pur supportando la compatibilità con le versioni precedenti, hanno rinominato lo spazio dei nomi da opendistro a opensearch
1.1 1.1.0.0
1.2 1.2.0.0 Aggiunto il supporto per la biblioteca Faiss
Elasticsearch
Versione di Elasticsearch Versione plug-in k-NN Caratteristiche da tenere in considerazione
7.1

1.3.0.0

Distanza Euclidea
7.4

1.4.0.0

7.7

1.8.0.0

Similitudine coseno
7.8

1.9.0.0

7.9

1.11.0.0

API di riscaldamento, punteggio personalizzato

7.10

1.13.0.0

Distanza di marcia, distanza di norma L1, scripting painless

La documentazione completa per il plug-in k-NN è disponibile nella documentazione di OpenSearch. Per informazioni di base sull'algoritmo k-nearest neighbors, vedi Wikipedia.

Nozioni di base su k-NN

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

Differenze, regolazione e limitazioni di k-NN

OpenSearch consente di modificare tutte le impostazioni k-NN utilizzando l'API _cluster/settings. In OpenSearch Service, è possibile modificare tutte le impostazioni tranne knn.memory.circuit_breaker.enabled e knn.circuit_breaker.triggered. Le statistiche k-NN sono incluse come parametri di Amazon CloudWatch.

In particolare, controllare il parametro KNNGraphMemoryUsage su ogni nodo di dati rispetto alla statistica knn.memory.circuit_breaker.limit e la RAM disponibile per il tipo di istanza. OpenSearch Service impiega la 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 * 0,5 * 0,5). Le prestazioni possono risentirne se l'utilizzo della memoria grafica supera questo valore.

Non puoi eseguire la migrazione di un indice k-NN a UltraWarm o ad archiviazione offline sicura se l'indice utilizza k-NN approssimato("index.knn": true). Se index.knn è impostato su false (k-NN preciso), è comunque possibile spostare l'indice su altri livelli di archiviazione.