对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

运行向量搜索查询

MongoDB Vector Search查询采用聚合管道的形式,该管道使用$vectorSearch作为第一阶段。本页介绍了 $vectorSearch 阶段的语法、选项和行为。

$vectorSearch

$vectorSearch 阶段采用包含以下字段的文档:

定义 $vectorSearch 阶段时,可以使用 exact 字段指定运行 近似最近邻 (ANN) 搜索还是 精确最近邻 (ENN) 搜索。

近似最近邻 (ANN)搜索

对于近似最近邻 (ANN)搜索, MongoDB 向量搜索 会根据向量嵌入在多维空间中的接近度以及所考虑的邻域数量,在您的数据中查找与查询中的向量嵌入最接近的向量嵌入。它使用Hierarchical Navigable Small Worlds算法,找到与查询中的向量嵌入最相似的向量嵌入,而无需扫描每个向量。因此,近似最近邻 (ANN) 搜索非常适合查询大型数据集,而无需进行大量过滤器。

注意

ANN搜索的最佳召回率通常被认为是与 9095ENN搜索的结果重叠约 - %,但延迟要低得多。这在准确性和性能之间提供了良好的平衡。要使用MongoDB Vector Search 实现此目的,请在查询时调整 numCandidates 参数。

您必须指定 numCandidates字段才能运行近似最近邻 (ANN)搜索。该字段确定 MongoDB 向量搜索 在搜索过程中考虑的最近邻数量。

使用 分层可导航小世界 索引结构执行向量搜索时,MongoDB 向量搜索通过填充优先队列来累积结果。numCandidates 参数控制此队列的大小,该参数确定在返回前 limit 个最佳结果之前要搜索多长时间。较大的队列(较高的 numCandidates)允许搜索探索更多的 分层可导航小世界 图表,可能会找到更好的匹配,但费用是增加查询延迟。

我们建议您指定的 numCandidates 数字至少比要返回的文档数量 (limit) 高 20 倍,以提高准确性并减少 精确最近邻 (ENN)近似最近邻 (ANN) 查询结果之间的差异。示例,如果将 limit设立为 5 结果,则可以考虑将 numCandidates 设置为 100 作为点。要学习;了解详情,请参阅如何衡量查询结果的准确性。

这种过度请求模式是在近似最近邻 (ANN) 搜索中平衡延迟和召回的推荐方法。不过,我们建议根据特定数据集大小和查询要求调整 numCandidates 参数。为确保获得准确的结果,请考虑以下变量:

精确最近邻 (ENN)搜索

对于精确最近邻 (ENN)搜索, MongoDB Vector Search 通过计算所有嵌入之间的距离来详尽搜索所有索引的向量嵌入,并为查询中的向量嵌入找到精确最近邻 (ENN)。此操作属于计算密集型任务,可能会对查询延迟负面影响。因此,我们建议对以下使用案例进行 精确最近邻 (ENN) 搜索:

$vectorSearch 必须是其所在的任何管道中的第一阶段。

$vectorSearch 不能用于视图定义和后续管道阶段:

[1] 您可以将 $vectorSearch 的结果传递给此阶段。

要学习;了解有关这些MongoDB Vector Search字段类型的更多信息,请参阅如何为向量搜索的字段创建索引。

MongoDB Vector Search 为其返回的每个文档分配一个分数,该分数在 01 之间的固定范围内(其中 0 表示低相似度,1 表示高相似度)。

注意

对数据进行预筛选不会影响MongoDB Vector Search 使用 vectorSearchScore 进行$vectorSearch 查询返回的分数。

MongoDB 向量搜索支持数据过滤器。您可以:

Atlas Vector Search 预过滤器和帖子过滤器

MongoDB 向量搜索对数据段进行独立的预过滤器和帖子过滤器操作。每个段的 HNSW 图表仅基于该段中的向量。MongoDB 向量搜索将过滤器应用于每个段的文档,以消除不符合过滤条件的文档。预过滤器可确保在 MongoDB 向量搜索遍历 HNSW 图表之前消除文档,帖子过滤器可确保从向量搜索结果中消除文档中的不相关文档或字段。

您可以使用过滤器预先筛选数据,以缩小语义搜索的范围,并确保只考虑相关向量进行比较。当使用 filter 选项预过滤数据时,MongoDB 向量搜索仅对数据的子集合执行语义搜索,从而减少 MongoDB 向量搜索查询占用的计算资源并提高性能。

预过滤可能过于限制,因为预过滤可能会排除与预过滤不完全匹配的数据,但在向量搜索过程中,该数据与您要考虑的查询在语义上相似。为了缓解这一问题,我们建议设置广泛的过滤器条件,以确保您的查询包含以下内容:

  • 包含尽可能多的相关结果。

  • 从结果中排除不相关数据。

  • 返回结果中请求的文档数量。

重要

筛选后的查询通常比其他等效的未筛选查询慢。

如果您的索引大小不适合预过滤器,或者设置了广泛的预过滤器条件,则可以对向量搜索结果进行后过滤器,以返回仅相关数据。要使用过滤器来过滤向量搜索的结果,可以使用任何支持的 聚合管道阶段,例如 $match 阶段,在 $vectorSearch 阶段之后。要了解更多信息,请参阅 其他性能建议。

要选择要在结果中返回的字段,请使用 $project 阶段,除非您需要结果中的所有字段。我们建议在 $project 阶段中排除向量字段,以提高查询性能。

示例,您可以使用 $project 阶段来包含 vectorSearchScore,然后使用 $match 阶段返回分数高于某个阈值的文档。

  • MongoDB Vector Search 支持 $eq 的简写形式。在简写形式中,您无需在查询中指定 $eq

    例如,考虑以下带有 $eq 的过滤器:

    "filter": { "_id": { "$eq": ObjectId("5a9427648b0beebeb69537a5") }

    这相当于以下过滤器,它使用 $eq 的简写形式:

    "filter": { "_id": ObjectId("5a9427648b0beebeb69537a5") }
  • 您可以使用 $and MQL 操作符在单个查询中指定过滤器数组。

    例如,考虑以下预过滤器,用于 genres 字段等于 Actionyear 字段值为 199920002001 的文档:

    "filter": {
    "$and": [
    { "genres": "Action" },
    { "year": { "$in": [ 1999, 2000, 2001 ] } }
    ]
    }
  • 对于模糊搜索、短语匹配、位置筛选和其他分析文本等高级筛选功能,请在 阶段使用 vectorSearch $search操作符。

在运行这些示例之前,请执行以下操作: