Ricerca K-Nearest Neighbor (k-NN) su Amazon Service OpenSearch - OpenSearch Servizio Amazon

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

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 descrive la compatibilità delle versioni tra OpenSearch Service e varie versioni del plug-in k-NN, nonché le limitazioni relative all'utilizzo del plug-in con il servizio gestito. OpenSearch Per una documentazione completa del plugin k-NN, inclusi esempi semplici e complessi, riferimenti ai parametri e il riferimento API completo per il plug-in, consulta la documentazione open source. OpenSearch La documentazione open source copre anche l'ottimizzazione delle prestazioni e le impostazioni dei cluster specifiche di K-NN.

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

OpenSearch
OpenSearch versione Versione plug-in k-NN Funzionalità significative
2.13 2,130,0

2.11 211,0,0

Aggiunto il supporto per ignore_unmapped le interrogazioni in k-NN

2.9 2,9,0,0 Implementati vettori di byte k-NN e filtraggio efficiente con il motore Faiss
2.7 2.7.0.0
2.5 2,5,0,0 Esteso SystemIndexPlugin per l'indice del sistema modello K-NN, aggiunte estensioni di file specifiche per Lucene al core HybridFS
2.3 2.3.0.0
1.3 1,30.0
1.2 1,20.0 Aggiunto il supporto per la biblioteca Faiss
1.1 1.1.0.0
1

1.0.0.0

Le REST API rinominate, pur supportando la compatibilità con le versioni precedenti, hanno rinominato lo spazio dei nomi da opendistro a opensearch
Elasticsearch
Versione di Elasticsearch Versione plug-in k-NN Caratteristiche da tenere in considerazione
7.1

1,30.0

Distanza Euclidea
7.4

1,40.0

7.7

1,80.0

Similitudine coseno
7.8

1,9,0,0

7.9

1.11.0.0

API di riscaldamento, punteggio personalizzato

7,10

1,130,0

Distanza di marcia, distanza di norma L1, scripting painless

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

Se devi gestire un grande volume di query mantenendo prestazioni ottimali, puoi utilizzare l'_msearchAPI 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.

Differenze, regolazione e limitazioni di k-NN

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

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 * 0,5 * 0,5). Le prestazioni possono risentirne se l'utilizzo della memoria grafica supera questo valore.

Non è possibile migrare un indice k-NN verso una conservazione a freddo se l'indice UltraWarmutilizza k-NN () approssimativo. "index.knn": true Se index.knn è impostato su false (k-NN preciso), è comunque possibile spostare l'indice su altri livelli di archiviazione.