Overview
在本指南中,您可以学习;了解如何使用 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应用程序,请访问入门教程。
执行向量搜索
重要
查询要求
您可以使用 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文档中的如何创建向量嵌入。
Vector Search Score 示例
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文档中的以下资源: