MongoDB Vector Search查询采用 $vectorSearch聚合管道的形式,该管道使用 作为第一阶段。本页介绍了$vectorSearch 阶段的语法、选项和行为。
支持的客户端
语法
字段
$vectorSearch 阶段采用包含以下字段的文档:
向量搜索类型
定义$vectorSearch 阶段时,可以使用exact 字段指定运行 ANN 搜索还是 ENN搜索。
对于近似最近邻 (ANN)搜索, MongoDB 向量搜索 会根据向量嵌入在多维空间中的接近度以及所考虑的邻域数量,在您的数据中查找与查询中的向量嵌入最接近的向量嵌入。它使用Hierarchical Navigable Small Worlds算法,找到与查询中的向量嵌入最相似的向量嵌入,而无需扫描每个向量。因此,近似最近邻 (ANN)搜索非常适合查询大型数据集,而无需进行大量过滤器。
注意
ANN搜索的最佳召回率通常被认为是与 9095ENN搜索的结果重叠约 - %,但延迟要低得多。这在准确性和性能之间提供了良好的平衡。要使用MongoDB Vector Search 实现此目的,请在查询时调整 numCandidates 参数。
numCandidates 选择
您必须指定 numCandidates字段才能运行近似最近邻 (ANN)搜索。该字段确定 MongoDB 向量搜索 在搜索过程中考虑的最近邻数量。
我们建议您指定的numCandidates 20数字至少比要返回的文档数量 () 高limit 倍,以提高准确性并减少 ENN 和 ANN查询结果之间的差异。示例,如果将 limit5numCandidates100设立为 结果,则可以考虑将 设置为 作为点。要学习;了解详情,请参阅 如何衡量查询结果的准确性。
这种过度请求模式是在近似最近邻 (ANN) 搜索中平衡延迟和召回的推荐方法。不过,我们建议根据特定数据集大小和查询要求调整 numCandidates 参数。为确保获得准确的结果,请考虑以下变量:
行为
$vectorSearch 必须是其所在的任何管道中的第一阶段。
限制
$vectorSearch 不能用于视图定义和后续管道阶段:
| [1] | 您可以将 $vectorSearch 的结果传递给此阶段。 |
MongoDB Vector Search 索引
要学习;了解有关这些MongoDB Vector Search字段类型的更多信息,请参阅如何为向量搜索的字段创建索引。
MongoDB Vector Search 评分
MongoDB Vector Search 为其返回的每个文档分配一个分数,该分数在 0 到 1 之间的固定范围内(其中 0 表示低相似度,1 表示高相似度)。
每个返回的文档都包含分数作为元数据。要返回每个文档的分数以及结果设立,请在聚合管道中使用 $project 阶段并将 score 配置为要项目的字段。在 score 字段中,指定值为 vectorSearchScore 的 $meta 表达式。语法如下:
1 db.<collection>.aggregate([ 2 { 3 "$vectorSearch": { 4 <query-syntax> 5 } 6 }, 7 { 8 "$project": { 9 "<field-to-include>": 1, 10 "<field-to-exclude>": 0, 11 "score": { "$meta": "vectorSearchScore" } 12 } 13 } 14 ])
注意
只有在$vectorSearch 管道阶段之后,才能将 vectorSearchScore用作score $meta 表达式。如果您在任何其他查询后使用 vectorSearchScore,则从MongoDB v8.2 开始,MongoDB会日志一条警告。
注意
对数据进行预筛选不会影响MongoDB Vector Search 使用 vectorSearchScore 进行$vectorSearch 查询返回的分数。
MongoDB Vector Search 预过滤
该 $vectorSearchfilter 选项匹配 BSON 布尔值、日期、objectId、数值、字符串和 UUID 值,包括这些类型的数组。
您必须将要用于过滤数据的字段作为 vectorSearch 类型索引定义中的过滤 类型进行索引。过滤数据有助于缩小语义搜索的范围,并确保不会考虑将所有向量进行比较。
MongoDB Vector Search$vectorSearchfilter 支持以下MQL操作符的 选项:
注意
$vectorSearch filter 选项不支持其他查询操作符、聚合管道操作符或MongoDB Search 操作符。
过滤器注意事项
MongoDB Vector Search 支持
$eq的简写形式。在简写形式中,您无需在查询中指定$eq。例如,考虑以下带有
$eq的过滤器:"filter": { "_id": { "$eq": ObjectId("5a9427648b0beebeb69537a5") } 这相当于以下过滤器,它使用
$eq的简写形式:"filter": { "_id": ObjectId("5a9427648b0beebeb69537a5") } 您可以使用
$andMQL 操作符在单个查询中指定过滤器数组。例如,考虑以下预过滤器,用于
genres字段等于Action和year字段值为1999、2000或2001的文档:"filter": { "$and": [ { "genres": "Action" }, { "year": { "$in": [ 1999, 2000, 2001 ] } } ] } 对于模糊搜索、短语匹配、位置过滤器和其他分析文本等高级过滤器功能,请在 阶段使用 vectorSearch
$search操作符。
示例
先决条件
在运行这些示例之前,请执行以下操作:
为集合创建MongoDB Vector Search 搜索索引。有关说明,请参阅创建MongoDB 向量搜索 索引过程,并以所需语言复制基本或过滤器示例的配置。
注意
如果您使用 mongosh,将示例代码中的 queryVector 粘贴到您的终端可能需要一段时间,具体取决于您的设备。