Búsqueda vectorial
$vectorSearch con índices vectoriales en los mismos nodos que tus documentos.
$vectorSearch encuentra los documentos cuyos vectores están más cerca del de tu consulta. Guardas el vector como un
campo más del documento y creas un índice de búsqueda de tipo vectorSearch.
Requisitos
- Los vectores de tus documentos, calculados con un modelo de embeddings.
- Un usuario que pueda crear índices de búsqueda en la colección.
Crear el índice
JavaScript
db.productos.createSearchIndex({
name: "vector",
type: "vectorSearch",
definition: {
fields: [
{ type: "vector", path: "embedding", numDimensions: 768, similarity: "cosine" },
{ type: "filter", path: "categoria" },
],
},
});Buscar
JavaScript
db.productos.aggregate([
{
$vectorSearch: {
index: "vector",
path: "embedding",
queryVector: vectorDeLaConsulta,
numCandidates: 200,
limit: 10,
filter: { categoria: "libros" },
},
},
{ $project: { nombre: 1, score: { $meta: "vectorSearchScore" } } },
]);Exacta o aproximada
Por defecto la búsqueda es aproximada: recorre un grafo HNSW por rango. Con exact: true compara con todos los
vectores y el resultado es el mismo en cualquier réplica. Sin exact, dos réplicas pueden devolver documentos distintos
a la misma marca, porque cada una enlaza su grafo al aplicar los cambios.
Comprobar
El pipeline del ejemplo devuelve hasta 10 documentos de la categoría pedida, con la puntuación vectorSearchScore de cada documento.
Problemas frecuentes
- El índice no encaja con tus vectores porque
numDimensionsno es el tamaño que da tu modelo. Créalo con ese tamaño. - Dos réplicas devuelven documentos distintos para la misma consulta. Es lo esperado sin
exact; conexact: trueel resultado es el mismo en todas.
Ver también
- Búsqueda semántica con $vectorSearch, una guía completa con embeddings.
- Búsqueda de texto