Una MongoDB Vector Search tiene la forma de un pipeline de agregación que usa $vectorSearch como la primera etapa. Esta página explica la sintaxis, las opciones y el comportamiento de la etapa $vectorSearch.
Clientes compatibles
Sintaxis
Campos
La etapa $vectorSearch procesa un documento con los siguientes campos:
Tipos de búsqueda vectorial
Cuando defines un $vectorSearch etapa, puedes usar el campo exact para especificar si ejecutar un Búsqueda de ANN o ENN.
Para la búsqueda de Approximate Nearest Neighbors (ANN), MongoDB Vector Search encuentra las incrustaciones vectoriales en sus datos que están más cercanas a la incrustación vectorial de su query, basándose en su proximidad en el espacio multidimensional y en el número de vecinos que considera. Utiliza mundos pequeños navegables jerárquicosEl algoritmo encuentra las incrustaciones vectoriales más similares a la incrustación vectorial de tu query sin escanear cada vector. Por lo tanto, la búsqueda ANN es ideal para consultar conjuntos de datos grandes sin un filtrado importante.
Nota
El recall óptimo para la búsqueda ANN se considera típicamente alrededor de un solapamiento del 90-95% en los resultados con la búsqueda ENN, pero con una latencia significativamente menor. Esto ofrece un buen equilibrio entre precisión y rendimiento. Para lograr esto con MongoDB Vector Search, ajusta el parámetro numCandidates en el momento de la query.
numCandidates Selección
Se debe especificar el campo numCandidates para ejecutar una búsqueda ANN. Este campo determina cuántos vecinos más cercanos considera MongoDB búsqueda vectorial durante la búsqueda.
Te recomendamos que especifiques un número de numCandidates al menos 20 veces mayor que el número de documentos a retornar (limit) para aumentar la precision y reducir las discrepancias entre tus resultados de query ENN y ANN. Por ejemplo, si se configura limit para devolver 5 resultados, se recomienda configurar numCandidates en 100 como punto de partida. Para aprender más, consulta Cómo medir la precisión de los resultados de las consultas.
Este patrón de sobrepetición es la forma recomendada de equilibrar la latencia y la capacidad de recuperación en las búsquedas de ANN. Sin embargo, recomendamos ajustar el parámetro numCandidates en función del tamaño específico del conjunto de datos y los requisitos de las queries. Para garantizar la obtención de resultados precisos, se deben considerar las siguientes variables:
Para una búsqueda de vecinos más cercanos exactos (ENN), MongoDB Vector Search busca exhaustivamente en todos los embeddings de vectores indexados calculando la distancia entre todos los embeddings y encuentra el vecino más cercano exacto para el embedding de vector en tu query. Esto requiere un uso intensivo de cálculos y podría impactar negativamente la latencia de la query. Por lo tanto, recomendamos ENN búsquedas para los siguientes casos de uso:
Comportamiento
$vectorSearch debe ser la primera etapa de cualquier pipeline en el que aparezca.
Limitaciones
$vectorSearch no se puede utilizar en definición de vista ni en las siguientes etapas de la pipeline:
| [1] | Puede transferir los resultados de $vectorSearch a esta etapa. |
MongoDB Vector Search indexación
Para obtener más información sobre estos tipos de campos de búsqueda vectorial de MongoDB, consulte Cómo indexar campos para la búsqueda vectorial.
Puntuación de MongoDB Vector Search
La búsqueda vectorial de MongoDB asigna una puntuación, en un rango fijo de 0 a 1 (donde 0 indica baja similitud y 1 indica alta similitud), a cada documento que devuelve.
Cada documento devuelto incluye la puntuación como metadatos. Para devolver la puntuación de cada documento junto con el conjunto de resultados, utiliza una etapa $project en el pipeline de agregación y configura el score como campo para proyectar. En el campo score, especifica una expresión $meta con el valor vectorSearchScore. La sintaxis es la siguiente:
1 db.<collection>.aggregate([ 2 { 3 "$vectorSearch": { 4 <query-syntax> 5 } 6 }, 7 { 8 "$project": { 9 "<field-to-include>": 1, 10 "<field-to-exclude>": 0, 11 "score": { "$meta": "vectorSearchScore" } 12 } 13 } 14 ])
Nota
Puedes usar vectorSearchScore como una expresión score $meta solamente después de la etapa de $vectorSearch del pipeline. Si usa vectorSearchScore después de cualquier otra query, MongoDB registra una advertencia a partir de MongoDB v8.2.
Nota
El prefiltrado de sus datos no afecta a la puntuación que devuelve la búsqueda vectorial de MongoDB mediante vectorSearchScore para queries $vectorSearch.
Pre-filtrado MongoDB Vector Search
La opción de filter $vectorSearch coincide con valores BSON booleanos, de fecha, objectId, numéricos, de string y UUID, incluidos arreglos de estos tipos.
Debes indexar los campos que deseas usar para filtrar tus datos como tipo de filtro en la definición del índice de tipo vectorSearch. Filtrar los datos es útil para delimitar el alcance de tu búsqueda semántica.
Importante
Las consultas filtradas suelen ser más lentas que una consulta no filtrada equivalente.
La búsqueda vectorial de MongoDB admite la opción $vectorSearch filter para los siguientes operadores MQL:
Tipo | Operador de MQL |
|---|---|
Igualdad | |
Rango | |
En conjunto | |
Existencia | |
Lógica |
Nota
La opción $vectorSearch filter no admite otros operadores del query, operadores de canalización de agregación ni operadores de búsqueda de MongoDB Search.
Consideraciones del filtro
La búsqueda vectorial de MongoDB admite la forma abreviada de
$eq. En la forma abreviada, no es necesario especificar$eqen la query.Por ejemplo, considere el siguiente filtro con
$eq:"filter": { "_id": { "$eq": ObjectId("5a9427648b0beebeb69537a5") } Esto es equivalente al siguiente filtro, que utiliza la forma corta de
$eq:"filter": { "_id": ObjectId("5a9427648b0beebeb69537a5") } Puedes usar el
$andMQL operador para especificar un arreglo de filtros en una sola query.Por ejemplo, considere el siguiente prefiltro para documentos con un campo
genresigual aActiony un campoyearcon el valor1999,2000o2001:"filter": { "$and": [ { "genres": "Action" }, { "year": { "$in": [ 1999, 2000, 2001 ] } } ] } Para capacidades avanzadas de filtrado como búsqueda difusa, coincidencia de frases, filtrado por ubicación y otros textos analizados, utiliza el operador vectorSearch en una etapa
$search.
Ejemplos
Requisitos previos
Antes de ejecutar estos ejemplos, realiza las siguientes acciones:
Añade el conjunto de datos a tu clúster.
Crea índices de MongoDB Vector Search para la colección. Para obtener instrucciones, consulta el procedimiento Crear un MongoDB Vector Search Index y copia las configuraciones de los ejemplos básicos o de filtro en el lenguaje que desees.
Nota
Si se usa mongosh, pegar el queryVector del código de muestra en el terminal podría tardar un poco dependiendo de la máquina.