Overview
En esta guía, puede aprender a usar Django MongoDB Backend para realizar Consultas debúsqueda vectorial de MongoDB. Esta función le permite realizar una búsqueda semántica en sus documentos. Una búsqueda semántica es un tipo de búsqueda que localiza información con significado similar, pero no necesariamente idéntico, al término o frase de búsqueda proporcionados.
Datos de muestra
Los ejemplos de esta guía utilizan el MovieWithEmbeddings Modelo, que representa la sample_mflix.embedded_movies colección de los conjuntos de datos de muestra del Atlas. La MovieWithEmbeddings clase de modelo 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.
Ejecutar ejemplos de código
Puedes usar el shell interactivo de Python para ejecutar los ejemplos de código. Para acceder al shell, ejecuta el siguiente comando desde el directorio raíz de tu 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 Django que use el Movie modelo y el shell interactivo de Python para interactuar con documentos MongoDB, visita el tutorial Primeros pasos.
Realiza una búsqueda vectorial
Importante
Requisitos de consulta
Antes de poder realizar consultas de búsqueda vectorial de MongoDB, debe crear un índice de búsqueda vectorial en su colección. Para aprender a usar el backend de Django MongoDB para crear un índice de búsqueda vectorial, consulte Índices de búsqueda vectorial en la guía "Crear índices".
Puedes usar el backend de Django MongoDB para consultar tus datos según su significado semántico. Una consulta de búsqueda vectorial de MongoDB devuelve resultados basados en un vector de consulta, o una matriz de números que representa el significado de tu término o frase de búsqueda. MongoDB compara este vector de consulta con los vectores almacenados en los campos vectoriales de tus documentos.
Para especificar los criterios de búsqueda vectorial, cree una instancia de la SearchVector clase de expresión proporcionada por el django_mongodb_backend.expressions módulo. Esta expresión corresponde a la etapa $vectorSearch de la canalización de MongoDB. Pase los siguientes argumentos al SearchVector() constructor:
path:El campo a consultar.query_vectorUna matriz de números que representa sus criterios de búsqueda. Para obtener más información sobre los vectores de consulta, consulte la sección sobre 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 predeterminadoFalsees. 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 consulta.
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> ) )
Ejemplo básico de búsqueda vectorial
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
5documentos.Especifica una búsqueda vectorial de Vecino Más Cercano Aproximado (ANN) que considera
150candidatos. 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 query_vector argumento. Para saber cómo generar un vector que represente el significado de un término o frase de búsqueda, consulte "Cómo crear incrustaciones de vectores manualmente" en la documentación de MongoDB Atlas.
Ejemplo de puntuación de búsqueda vectorial
MongoDB asigna una puntuación de relevancia a cada documento devuelto en una consulta de búsqueda vectorial. Los documentos incluidos en un conjunto de resultados se ordenan de mayor a menor puntuación de relevancia.
Para incluir esta puntuación en los resultados de la consulta, puede usar el método values() de la API QuerySet de Django. Pase el campo score como argumento al método values().
El siguiente ejemplo muestra cómo ejecutar la misma consulta de búsqueda vectorial que el ejemplo anterior e imprimir los puntajes 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}]>
Información Adicional
Para obtener más información sobre MongoDB Vector Search, consulte los siguientes recursos de la documentación de MongoDB Atlas: