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 numDimensions no 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; con exact: true el resultado es el mismo en todas.

Ver también