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 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.

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.

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.

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 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 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>
)
)

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 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.

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}]>

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