Docs 菜单
Docs 主页
/ /
/ / /

运行MongoDB Vector Search 查询

在本指南中,您可以学习;了解如何使用 Django MongoDB后端来执行 MongoDB Vector Search 查询。此功能允许您对文档执行语义搜索。语义搜索是一种搜索,可查找与您提供的搜索术语或短语含义相似但不一定相同的信息。

本指南中的示例使用 MovieWithEmbeddings 模型,它表示Atlas示例数据集sample_mflix.embedded_movies集合。MovieWithEmbeddings 模型类具有以下定义:

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

MovieWithEmbeddings 模型包括一个内部 Meta 类(用于指定模型元数据)和一个 __str__() 方法(用于定义模型的字符串表示形式)。 要学习;了解这些模型功能,请参阅创建模型指南中的 定义模型。

您可以使用Python交互式Shell来运行代码示例。 要进入Shell ,请从项目的根目录运行以下命令:

python manage.py shell

进入Python Shell后,请确保导入以下模型和模块:

from <your application name>.models import MovieWithEmbeddings

要学习;了解如何创建使用 Movie 模型和Python交互式Shell与MongoDB文档交互的Django应用程序,请访问入门教程

重要

查询要求

在执行MongoDB Vector Search 查询之前,您必须在集合上创建 Vector Search索引。要学习;了解如何使用 Django MongoDB后端创建向量搜索索引,请参阅创建索引指南中的向量搜索索引。

您可以使用 Django MongoDB后端根据数据的语义查询数据。 MongoDB Vector Search查询根据查询向量或表示搜索术语或短语含义的数字大量返回结果。 MongoDB将此查询向量与存储在文档向量字段中的向量进行比较。

要指定向量搜索条件,请创建SearchVector 模块提供的django_mongodb_backend.expressions 表达式类的实例。该表达式对应于$vectorSearch MongoDB管道阶段。将以下参数传递给SearchVector() 构造函数:

  • path:要查询的字段。

  • query_vector:表示搜索条件的数字大量。要学习;了解有关查询向量的更多信息,请参阅MongoDB Atlas文档中的向量

  • limit:要返回的最大结果数。

  • num_candidates(可选)查询要考虑的文档数量。

  • exact : (可选)布尔值,表示是否执行精确最近邻 (ENN)搜索。默认值为 False。要学习;了解有关 ENN 搜索的更多信息,请参阅 MongoDB Atlas 文档中的 ENN(精确最近邻)搜索

  • filter(可选)应用查询结果的过滤。

然后,通过将SearchVector annotate实例传递给 Django 的QuerySet API中的 方法运行向量搜索查询。以下代码显示了执行向量搜索查询的事务语法:

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

此示例对 sample_mflix.embedded_movies集合运行MongoDB Vector Search查询。该查询执行以下操作:

  • 查询 plot_embedding 向量字段。

  • 将结果限制为 5 个文档。

  • 指定考虑 150 个候选的近似最近邻 (ANN)向量搜索。要学习;了解有关 ANN 搜索的更多信息,请参阅 MongoDB Atlas 文档中的 ANN(近似最近邻)搜索

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

提示

前面的代码示例将任意向量传递给 query_vector 参数。要学习;了解如何生成表示搜索术语或短语含义的向量,请参阅MongoDB Atlas文档中的如何创建向量嵌入

MongoDB为向量搜索查询中返回的每个文档分配一个相关性分数。结果设立包含的文档按相关性分数从高到低排序。

要在查询结果中包含此分数,可以使用 Django 的 QuerySet API中的 values() 方法。将 score字段作为参数传递给 values() 方法。

以下示例展示了如何运行与前面的示例相同的向量搜索查询,并打印文档的向量搜索相关性分数:

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

要学习;了解有关MongoDB Vector Search 的更多信息,请参阅MongoDB Atlas文档中的以下资源:

后退

MongoDB Search

在此页面上