Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Búsqueda k-Nearest Neighbor (k-NN) en Amazon OpenSearch Service
Con la sigla en inglés de su algoritmo asociado vecinos más cercanos de k, k-NN para Amazon OpenSearch Service permite buscar puntos en un espacio vectorial y encontrar los “vecinos más cercanos” de esos puntos por distancia euclidiana o similitud de coseno. Los casos de uso incluyen recomendaciones (por ejemplo, una función de “otras canciones que podrían gustarte” en una aplicación de música), reconocimiento de imágenes y detección de fraude.
Utilice las siguientes tablas para encontrar la versión del complemento k-NN que se ejecuta en un dominio de Amazon OpenSearch Service. Cada versión del complemento k-NN corresponde a una versión de OpenSearch
OpenSearch | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Versión de OpenSearch | Versión del complemento k-NN | Características notables | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.11 | 2.11.0.0 |
Se agregó soporte para consultas |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.9 | 2.9.0.0 | Se implementaron vectores de bytes k-NN y un filtrado eficiente con el motor Faiss |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.7 | 2.7.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2,5 | 2.5.0.0 | Se amplió SystemIndexPlugin para el índice de sistema del modelo k-NN. Se añadieron extensiones de archivo específicas de Lucene al núcleo de HybridFS | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.3 | 2.3.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.3 | 1.3.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.2 | 1.2.0.0 | Se agregó compatibilidad con la biblioteca Faiss |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.1 | 1.1.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.0 |
1.0.0.0 |
API de REST renombradas mientras admite la compatibilidad con versiones anteriores, espacio de nombres renombrado de opendistro a opensearch |
Elasticsearch | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Versión de Elasticsearch | Versión del complemento k-NN | Características notables | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7.1 |
1.3.0.0 |
Distancia euclidiana | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7.4 |
1.4.0.0 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7.7 |
1.8.0.0 |
Similitud coseno | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7.8 |
1.9.0.0 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7.9 |
1.11.0.0 |
Periodo de preparación de la API, puntuación personalizada | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7.10 |
1.13.0.0 |
Distancia de Hamming, distancia de norma L1, scripting Painless |
La documentación completa sobre el complemento k-NN está disponible en la documentación de OpenSearch
Introducción a k-NN
Para utilizar k-NN, debe crear un índice con la configuración index.knn
y agregar uno o más campos del tipo de datos 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 } } } }
El tipo de datos knn_vector
admite una sola lista de hasta 10 000 flotadores, con el número de flotadores definido por el parámetro dimension
requerido. Después de crear el índice, agregue algunos datos.
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 }
A continuación, puede buscar los datos mediante el tipo de consulta knn
.
GET my-index/_search { "size": 2, "query": { "knn": { "
my_vector2
": { "vector": [2, 3, 5, 6], "k": 2 } } } }
En este caso, k
es el número de vecinos que desea que devuelva la consulta, pero también debe incluir la opción size
. De lo contrario, obtendrá k
resultados para cada partición (y cada segmento) en lugar de k
resultados para toda la consulta. k-NN admite un valor de k
máximo de 10 000.
Si mezcla la consulta knn
con otras cláusulas, es posible que reciba menos resultados k
. En este ejemplo, la cláusula post_filter
reduce el número de resultados de 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 } } } }
Si necesita gestionar un gran volumen de consultas y, al mismo tiempo, mantener un rendimiento óptimo, puede utilizar la API _msearch
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 }} } }
En el siguiente video se muestra cómo configurar búsquedas vectoriales masivas para consultas K-NN.
Diferencias, ajuste y limitaciones de k-NN
OpenSearch permite modificar todas las configuraciones de k-NN_cluster/settings
. En OpenSearch Service, puede cambiar todas las configuraciones, excepto knn.memory.circuit_breaker.enabled
y knn.circuit_breaker.triggered
. Las estadísticas k-NN se incluyen como Métricas de Amazon CloudWatch.
En particular, verifique la métrica KNNGraphMemoryUsage
en cada nodo de datos con respecto a la estadística knn.memory.circuit_breaker.limit
y la RAM disponible para el tipo de instancia. OpenSearch Service utiliza la mitad de la RAM de una instancia para la pila de Java (hasta un tamaño de pila de 32 GiB). De forma predeterminada, k-NN utiliza hasta el 50 % de la mitad restante, por lo que un tipo de instancia con 32 GiB de RAM puede acomodar 8 GiB de gráficos (32 * 0,5 * 0,5). El rendimiento puede verse afectado si el uso de la memoria gráfica supera este valor.
No puede migrar un índice k-NN a un almacenamiento UltraWarm o almacenamiento en frío si el índice utiliza k-NN aproximado"index.knn": true
). Si index.knn
está configurado en false
(k-NN exacto