Menu Docs
Página inicial do Docs
/ /
/ / /

Executar uma query de pesquisa vetorial do MongoDB

Neste guia, você pode aprender como usar o backend do Django MongoDB para executar queries de pesquisa do MongoDB Vector Search. Esse recurso permite realizar uma pesquisa semântica em seus documentos. Uma pesquisa semântica é um tipo de pesquisa que localiza informações com significado semelhante, mas não necessariamente idênticas, ao termo ou frase de pesquisa fornecida.

Os exemplos nesta aba usam o modelo MovieWithEmbeddings, que representa a collection sample_mflix.embedded_movies dos conjuntos de dados de amostra do Atlas. A classe de modelo MovieWithEmbeddings tem a seguinte definição:

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

O modelo MovieWithEmbeddings inclui uma classe Meta interna, que especifica os metadados do modelo, e um método __str__(), que define a representação de string do modelo. Para saber mais sobre essas funcionalidades de modelo, consulte Definir um modelo no guia Criar modelos.

Você pode usar o shell interativo do Python para executar os exemplos de código. Para entrar na shell, execute o seguinte comando no diretório raiz do seu projeto:

python manage.py shell

Depois de inserir o shell do Python, certifique-se de importar os seguintes modelos e módulos:

from <your application name>.models import MovieWithEmbeddings

Para saber como criar um aplicação Django que use o modelo Movie e o shell interativo Python para interagir com documentos do MongoDB, acesse o tutorial de Introdução.

Importante

Requisitos de query

Antes de executar queries de pesquisa do MongoDB pesquisa vetorial, você deve criar um índice de pesquisa vetorial em sua coleção. Para aprender como usar o backend do MongoDB do Django para criar um índice de pesquisa vetorial, veja Índices de pesquisa vetorial no guia Criar índices.

Você pode usar o Django MongoDB backend para fazer query em seus dados com base em seu significado semântico. Uma query do MongoDB pesquisa vetorial retorna resultados com base em um vetor de query ou em um array de números que representa o significado do seu termo ou frase de pesquisa. O MongoDB compara esse vetor de query com os vetores armazenados nos campos de vetor de seus documentos.

Para especificar seus critérios da pesquisa vetorial, crie uma instância da classe de expressão SearchVector fornecida pelo módulo django_mongodb_backend.expressions. Esta expressão corresponde ao estágio de pipeline MongoDB $vectorSearch. Passe os seguintes argumentos para o construtor SearchVector():

  • path: O campo a ser consultado.

  • query_vector: uma array de números que representa seus critérios de pesquisa. Para saber mais sobre vetores de query, consulte vetores na documentação do MongoDB Atlas.

  • limit: o número máximo de resultados a serem retornados.

  • num_candidates: (Opcional) O número de documentos a considerar para a query.

  • exact: (Opcional) Um valor booleano que indica se deve ser executada uma pesquisa pelo vizinho mais próximo (ENN). O valor padrão False é. Para saber mais sobre pesquisas ENN, consulte ENN Search na documentação do MongoDB Atlas .

  • filter: (Opcional) Um filtro para aplicar aos resultados da consulta.

Em seguida, execute sua query de pesquisa vetorial passando sua instância SearchVector para o método annotate da API QuerySet do Django. O seguinte código mostra a sintaxe para executar uma query da pesquisa vetorial:

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 exemplo executa uma query do MongoDB pesquisa vetorial na coleção sample_mflix.embedded_movies. A query executa as seguintes ações:

  • Executa query do campo vetorial plot_embedding.

  • Limita os resultados a 5 documentos.

  • Especifica uma pesquisa vetorial do vizinho mais próximo (ANN) que considera 150 candidatos. Para saber mais sobre pesquisas de ANN, consulte Pesquisa de ANN na documentação do 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>]>

Dica

O exemplo de código anterior passa um vetor arbitrário para o argumento query_vector. Para saber como gerar um vetor que representa o significado de um termo ou frase de pesquisa, consulte Como criar incorporações vetoriais na documentação do MongoDB Atlas.

O MongoDB atribui uma pontuação de relevância a cada documento retornado em uma query da pesquisa vetorial. Os documentos incluídos em um conjunto de resultados são ordenados da pontuação de relevância mais alta para a mais baixa.

Para incluir essa pontuação nos resultados da query, você pode usar o método values() da API QuerySet do Django. Passe o campo score como um argumento para o método values().

O exemplo a seguir mostra como executar a mesma query de pesquisa vetorial do exemplo anterior e imprimir as pontuações de relevância da pesquisa vetorial dos 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 saber mais sobre a pesquisa vetorial do MongoDB, consulte o seguinte recurso na documentação do MongoDB Atlas:

Voltar

MongoDB Search

Nesta página