Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
/ / /

Ejecuta una query de búsqueda vectorial en MongoDB

En esta guía, puede aprender a usar Django MongoDB Backend para realizar MongoDB Vector Search queries. Esta funcionalidad te permite realizar una búsqueda semántica en tus documentos. Una búsqueda semántica es un tipo de búsqueda que localiza información que es similar en significado, pero no necesariamente idéntica, al término o frase de búsqueda que has proporcionado.

Los ejemplos de esta guía utilizan el MovieWithEmbeddings el modelo, que representa la colección sample_mflix.embedded_movies de los Conjuntos de datos de muestra de Atlas. La clase del modelo MovieWithEmbeddings tiene la siguiente definición:

from django.db import models
from django_mongodb_backend.fields import ArrayField
class MovieWithEmbeddings(models.Model):
title = models.CharField(max_length=200)
runtime = models.IntegerField(default=0)
plot_embedding = ArrayField(models.FloatField(), size=1536, null=True, blank=True)
class Meta:
db_table = "embedded_movies"
managed = False
def __str__(self):
return self.title

El modelo MovieWithEmbeddings incluye una clase interna Meta, que especifica los metadatos del modelo, y un método __str__(), que define la representación de cadena del modelo. Para obtener más información sobre estas características del modelo, consulte Defina un modelo en la guía Crear modelos.

Puedes usar la shell interactiva de Python para ejecutar los ejemplos de código. Para ingresar a la shell, ejecute el siguiente comando desde el directorio raíz de su Proyecto:

python manage.py shell

Después de ingresar al shell de Python, asegúrese de importar los siguientes modelos y módulos:

from <your application name>.models import MovieWithEmbeddings

Para aprender a crear una aplicación de Django que use el modelo Movie y el shell interactivo de Python para interactuar con documentos de MongoDB, visita el tutorial de Introducción a Django MongoDB Backend.

Importante

Requisitos de consulta

Antes de que se puedan realizar consultas de MongoDB Vector Search, se debe crear un índice de búsqueda vectorial en su colección. Para aprender a usar Django MongoDB backend para crear un índice de búsqueda vectorial, consulta Índices de búsqueda vectorial en la guía Crear Índices.

Puede usar Django MongoDB Backend para query sus datos según su significado semántico. Una query de MongoDB Vector Search devuelve resultados basados en un vector de query, es decir, un arreglo de números que representa el significado de tu término o frase de búsqueda. MongoDB compara este vector de query con los vectores almacenados en los campos vector de tus documentos.

Para especificar tus criterios de búsqueda vectorial, crea una instancia de la clase de expresión SearchVector proporcionada por el módulo django_mongodb_backend.expressions. Esta expresión corresponde a la etapa de pipeline de MongoDB $vectorSearch. Pasa los siguientes argumentos al constructor de SearchVector():

  • path: El campo a query.

  • query_vector: Un arreglo de números que representan sus criterios de búsqueda. Para obtener más información sobre los vectores de query, consulta vectores en la documentación de MongoDB Atlas.

  • limit: El número máximo de resultados a devolver.

  • num_candidates: (Opcional) El número de documentos a considerar para la consulta.

  • exact: (Opcional) Un valor booleano que indica si se debe realizar una búsqueda de vecino más cercano exacto (ENN). El valor predeterminado False es. Para obtener más información sobre las búsquedas ENN, consulte Búsqueda ENN en la documentación de MongoDB Atlas.

  • filter: (Opcional) Un filtro para aplicar a los resultados de la query.

Luego, ejecute su consulta de búsqueda vectorial pasando su SearchVector instancia al annotate método desde la API de Django.QuerySet El siguiente código muestra la sintaxis para realizar una consulta de búsqueda vectorial:

from django_mongodb_backend.expressions import SearchVector
Model.objects.annotate(
score=SearchVector(
path="<field name>",
query_vector=[<vector values>],
limit=<number>,
num_candidates=<number>,
exact=<boolean>,
filter=<filter expression>
)
)

Este ejemplo ejecuta una consulta de búsqueda vectorial de MongoDB en la colección sample_mflix.embedded_movies. La consulta realiza las siguientes acciones:

  • Consulta el campo vectorial plot_embedding.

  • Limita los resultados a 5 documentos.

  • Especifica una búsqueda vectorial de Vecino Más Cercano Aproximado (ANN) que considera 150 candidatos. Para obtener más información sobre las búsquedas ANN, consulta Búsqueda ANN en la documentación de MongoDB Atlas.

vector_values = [float(i % 10) * 0.1 for i in range(1536)]
MovieWithEmbeddings.objects.annotate(
score=SearchVector(
path="plot_embedding",
query_vector=vector_values,
limit=5,
num_candidates=150,
exact=False,
)
)
<QuerySet [<MovieWithEmbeddings: Berserk: The Golden Age Arc I - The Egg of the King>,
<MovieWithEmbeddings: Rollerball>, <MovieWithEmbeddings: After Life>,
<MovieWithEmbeddings: What Women Want>, <MovieWithEmbeddings: Truth About Demons>]>

Tip

El ejemplo de código anterior pasa un vector arbitrario al argumento query_vector. Para aprender cómo generar un vector que represente el significado de un término o frase de búsqueda, consulta Cómo crear incrustaciones vectoriales manualmente en la documentación de MongoDB Atlas.

MongoDB asigna una puntuación de relevancia a cada documento devuelto en una búsqueda vectorial query. Los documentos incluidos en un conjunto de resultados se ordenan desde el puntaje de relevancia más alto hasta el más bajo.

Para incluir esta puntuación en los resultados de tu query, puedes utilizar el método values() de la API QuerySet de Django. Pasa el campo score como argumento al método values().

El siguiente ejemplo muestra cómo ejecutar la misma query de búsqueda vectorial que el ejemplo anterior e imprimir las puntuaciones de relevancia de búsqueda vectorial de los documentos:

vector_values = [float(i % 10) * 0.1 for i in range(1536)]
MovieWithEmbeddings.objects.annotate(
score=SearchVector(
path="plot_embedding",
query_vector=vector_values,
limit=5,
num_candidates=150,
exact=False,
)
).values("title", "score")
<QuerySet [{'title': 'Berserk: The Golden Age Arc I - The Egg of the King', 'score': 0.47894009947776794},
{'title': 'Rollerball', 'score': 0.45006513595581055}, {'title': 'After Life', 'score': 0.42825883626937866},
{'title': 'What Women Want', 'score': 0.4211753308773041}, {'title': 'Truth About Demons', 'score': 0.4194544851779938}]>

Para obtener más información sobre MongoDB Vector Search, consulte los siguientes recursos de la documentación de MongoDB Atlas:

Volver

MongoDB búsqueda

En esta página