MongoDB Vector Search查询采用聚合管道的形式,该管道使用 $vectorSearch作为第一阶段。本页介绍了$vectorSearch 阶段的语法、选项和行为。
支持的客户端
语法
字段
$vectorSearch 阶段采用包含以下字段的文档:
向量搜索类型
定义 $vectorSearch 阶段时,可以使用 exact字段指定运行ANN 搜索还是 ENN搜索。
对于近似最近邻 (ANN)搜索, MongoDB 向量搜索 会根据向量嵌入在多维空间中的接近度以及所考虑的邻域数量,在您的数据中查找与查询中的向量嵌入最接近的向量嵌入。它使用Hierarchical Navigable Small Worlds算法,找到与查询中的向量嵌入最相似的向量嵌入,而无需扫描每个向量。因此,近似最近邻 (ANN) 搜索非常适合查询大型数据集,而无需进行大量过滤器。
注意
numCandidates 选择
您必须指定 numCandidates字段才能运行近似最近邻 (ANN)搜索。该字段确定 MongoDB 向量搜索 在搜索过程中考虑的最近邻数量。
当您使用 Hierarchical Navigable Small Worlds索引结构执行向量搜索时, MongoDB Vector Search 通过填充优先级队列来累积结果。numCandidates 参数控制此队列的大小,从而确定返回前limit 个结果之前的搜索时间。较大的队列(较高的numCandidates )允许搜索探索更多的“可分层导航的小世界”图表,可能会以增加查询延迟为费用找到更好的匹配项。
我们建议您指定的 numCandidates 数字至少比要返回的文档数量 (limit) 高 20 倍,以提高准确性并减少 ENN 和 ANN查询结果之间的差异。示例,如果将 limit设立为 5 结果,则可以考虑将 numCandidates 设置为 100 作为点。要学习;了解详情,请参阅如何衡量查询结果的准确性。
这种过度请求模式是在 ANN 搜索中平衡延迟和召回的推荐方法。不过,我们建议根据特定数据集大小和查询要求调整 numCandidates 参数。为确保获得准确的结果,请考虑以下变量:
Considerations
$vectorSearch 必须是其所在的任何管道中的第一阶段。
限制
$vectorSearch不能用于视图定义和以下管道阶段:
$facet管道阶段
| [1] | 您可以将$vectorSearch 的结果传递给此阶段。 |
MongoDB Vector Search 索引
要学习;了解有关这些MongoDB Vector Search字段类型的更多信息,请参阅如何为向量搜索的字段创建索引。
MongoDB Vector Search 评分
MongoDB Vector Search 为其返回的每个文档分配一个分数,该分数在 0 到 1 之间的固定范围内(其中 0 表示低相似度,1 表示高相似度)。
注意
对数据进行预过滤不会影响MongoDB Vector Search 使用 进行vectorSearchScore $vectorSearch查询返回的分数。
MongoDB 向量搜索过滤器
MongoDB 向量搜索支持数据过滤器。您可以:
使用 和其他支持的聚合管道阶段对MongoDB Vector Search查询的结果进行后筛选。
$match

MongoDB 向量搜索对数据段进行独立的预过滤器和帖子过滤器操作。每个段的 HNSW 图表仅基于该段中的向量。MongoDB 向量搜索将过滤器应用于每个段的文档,以消除不符合过滤条件的文档。预过滤器可确保在 MongoDB 向量搜索遍历 HNSW 图表之前消除文档,帖子过滤器可确保从向量搜索结果中消除文档中的不相关文档或字段。
预过滤搜索数据
您可以使用过滤器预先筛选数据,以缩小语义搜索的范围,并确保只考虑相关向量进行比较。当使用 filter 选项对数据进行预过滤时,MongoDB 向量搜索仅对数据的子集合执行语义搜索,这可提高搜索结果的准确性。
预过滤可能过于限制,因为预过滤可能会排除与预过滤不完全匹配的数据,但在向量搜索过程中,该数据与您要考虑的查询在语义上相似。为了缓解这一问题,我们建议设置广泛的过滤器条件,以确保您的查询包含以下内容:
包含尽可能多的相关结果。
从结果中排除不相关数据。
返回结果中请求的文档数量。
重要
筛选后的查询通常比其他等效的未筛选查询慢。
帖子-过滤器搜索结果
如果索引大小不适合预筛选,或者设立了广泛的预筛选条件,则可以对向量搜索结果进行后筛选,仅返回相关数据。要过滤向量搜索的结果,您可以在 阶段之后使用任何受支持的聚合管道阶段,例如$match $vectorSearch阶段。要学习;了解更多信息,请参阅其他性能建议。
要选择要在结果中返回的字段,请使用$project 阶段,除非您需要结果中的所有字段。我们建议在$project 阶段排除向量字段,以提高查询性能。
示例,您可以使用$project 阶段包含vectorSearchScore ,然后使用$match 阶段仅返回高于特定分数阈值的文档。
过滤器注意事项
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 向量搜索索引。有关说明,请参阅创建 MongoDB 向量搜索索引过程,并以所需语言为示例查询配置索引。
查询
了解详情
以下教程演示了 $vectorSearch 阶段的其他使用案例。