Docs 菜单
Docs 主页
/
MongoDB Atlas
/

运行向量搜索查询

在此页面上

  • 定义
  • 字段
  • 行为
  • Atlas Vector Search 索引
  • Atlas Vector Search 分数
  • Atlas Vector Search 预筛选
  • 限制
  • 支持的客户端
  • 跨分段并行查询执行
  • 举例

Atlas Vector Search 查询采用聚合管道阶段的形式。对于 $vectorSearch查询,Atlas Vector Search 会返回语义搜索的结果。

$vectorSearch阶段对指定字段中的向量执行 ANN 搜索。您要搜索的字段必须在 vectorSearch 索引类型内作为 Atlas Vector Search 向量 类型进行索引。

$vectorSearch

$vectorSearch 管道采用以下原型形式:

{
"$vectorSearch": {
"index": "<index-name>",
"path": "<field-to-search>",
"queryVector": [<array-of-numbers>],
"numCandidates": <number-of-candidates>,
"limit": <number-of-results>,
"filter": {<filter-specification>}
}
}

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

字段
类型
必要性
说明
filter
文档
Optional

任何将索引字段与布尔值、数字(非小数)或字符串进行比较以用作预筛选器的MQL匹配表达式。您可以在筛选器中使用以下任何比较查询聚合管道操作符:

要了解更多信息,请参阅Atlas Vector Search 预筛选。

index
字符串
必需

要使用的 Atlas Vector Search 索引的名称。

如果您写错索引名称,或者指定的索引在集群上尚不存在,则 Atlas Vector Search 不会返回结果。

limit
数字
必需
要在结果中返回的文档数量(仅限 int)。值不能超过 numCandidates 的值。
numCandidates
数字
必需

搜索期间要使用的最近邻数量。值必须小于或等于 (<=) 10000。指定的数字不能小于要返回的文档数量 (limit)。

我们建议您指定一个大于要返回的文档数 ( limit ) 的数字以提高准确性,尽管这可能会影响延迟。例如,对于仅限制一个文档的情况,我们建议将最近邻的比率设置为 10:20。这种过度请求模式是在ANN搜索中平衡延迟和召回的推荐方法,建议根据特定数据集进行调整。

path
字符串
必需
要搜索的索引 vectorEmbedding 类型字段。要了解更多信息,请参阅路径构造
queryVector
数字数组
必需

表示查询向量的 BSON double 类型的数字数组。数组大小必须与字段的索引定义中指定的向量 dimensions 的数量相匹配。

注意

您必须使用用于嵌入数据的同一模型来嵌入查询。

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

您必须使用$vectorSearch vectorSearch 类型索引定义中的 阶段对要搜索的字段进行索引。您可以在 Atlas Vector Search vectorSearch 类型索引定义中对以下类型的字段进行索引:

  • 包含向量嵌入作为向量类型的字段。

  • 包含布尔值、数值和字符串值作为筛选类型的字段,以启用对预筛选数据的向量搜索。

要了解有关这些 Atlas Vector Search 字段类型的更多信息,请参阅如何为向量搜索的字段进行索引

Atlas Vector Search 为其返回的每个文档分配一个分数,该分数在 01 之间的固定范围内。对于 cosinedotProduct相似度,Atlas Vector Search 使用以下算法对分数进行归一化:

score = (1 + cosine/dot_product(v1,v2)) / 2

分配给返回文档的分数是文档元数据的一部分。要包含每个返回文档的分数以及结果集,请在聚合管道中使用$project阶段。

要检索 Atlas Vector Search 查询结果的分数,请使用vectorSearchScore作为$meta表达式中的值。也就是说,在$vectorSearch阶段之后的$project阶段, score字段采用$meta表达式。该表达式需要vectorSearchScore值来返回向量搜索的文档分数。

例子

1db.<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])

注意

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

$vectorSearchfilter选项仅匹配 BSON 布尔值、字符串和数值。您 必须 vectorSearch 类型索引定义中对要筛选数据的字段作为 筛选器 类型进行索引。筛选数据有助于缩小语义搜索的范围,并确保不会考虑所有向量进行比较。

$vectorSearch filter选项仅支持以下比较查询运算符:

  • $gt

  • $lt

  • $gte

  • $lte

  • $eq

    注意

    Atlas Vector Search 还支持 $eq 的简写形式。在简写形式中,您不需要在查询中指定 $eq。例如,考虑以下 $eq 查询:

    { "genres": { "$eq": "Comedy" } }

    您可以使用 $eq 的简写形式运行前面的查询,方法如下:

    { "genres": "Comedy" }
  • $ne

  • $in

  • $nin

只能匹配单个值,不支持值数组。

$vectorSearch filter选项仅支持以下聚合管道操作符:

注意

$vectorSearch filter选项不支持其他比较查询聚合管道操作符。

$vectorSearch 仅适用于运行以下 MongoDB 版本的 Atlas 集群:

  • v6.0.11

  • v7.0.2 及更高版本(包括 RC)。

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

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

您可以使用$vectorSearch AtlasData Explorer 、 、mongosh 和以下驱动程序运行 查询:

您还可以将 Atlas Vector Search 与通过 Atlas CLI 创建的本地 Atlas 部署结合使用。要了解更多信息,请参阅创建本地 Atlas 部署。

我们建议使用专用搜索节点来隔离向量搜索查询处理。您可能会发现专用搜索节点上的查询性能得到提高。请注意,高 CPU 系统可能会提供更多的性能改进。当 Atlas Vector Search 在搜索节点上运行时,Atlas Vector Search 会跨数据段并行执行查询。

在许多情况下,查询处理的并行化可以缩短响应时间,例如对大型数据集的查询。在 Atlas Vector Search 查询处理期间使用查询内并行机制会占用更多资源,但会缩短每个查询的延迟。

注意

Atlas Vector Search 不保证每个查询都会同时运行。例如,当排队的并发查询过多时,Atlas Vector Search 可能会转为单线程执行。

以下查询使用$vectorSearch阶段搜索示例sample_mflix.embedded_movies集合。查询搜索plot_embedding字段,其中包含使用 OpenAI 的text-embedding-ada-002嵌入模型创建的嵌入。如果已将样本集合添加到 Atlas 集群并为该集合创建了样本索引,则可以对该集合运行以下查询。


➤ 使用选择语言下拉菜单设置此页面中示例的语言。


← 编辑 Atlas Vector Search 索引