运行向量搜索查询
Atlas Vector Search 查询采用聚合管道阶段的形式。对于 $vectorSearch
查询,Atlas Vector Search 会返回语义搜索的结果。
定义
$vectorSearch
阶段对指定字段中的向量执行 ANN 搜索。您要搜索的字段必须在 vectorSearch 索引类型内作为 Atlas Vector Search 向量 类型进行索引。
字段
$vectorSearch
阶段采用包含以下字段的文档:
字段 | 类型 | 必要性 | 说明 |
---|---|---|---|
filter | 文档 | Optional | |
index | 字符串 | 必需 | 要使用的 Atlas Vector Search 索引的名称。 如果您写错索引名称,或者指定的索引在集群上尚不存在,则 Atlas Vector Search 不会返回结果。 |
limit | 数字 | 必需 | 要在结果中返回的文档数量(仅限 int )。值不能超过 numCandidates 的值。 |
numCandidates | 数字 | 必需 | 搜索期间要使用的最近邻数量。值必须小于或等于 ( 我们建议您指定一个大于要返回的文档数 ( |
path | 字符串 | 必需 | 要搜索的索引 vectorEmbedding 类型字段。要了解更多信息,请参阅路径构造。 |
queryVector | 数字数组 | 必需 | 表示查询向量的 BSON 注意您必须使用用于嵌入数据的同一模型来嵌入查询。 |
行为
$vectorSearch
必须是其所在的任何管道中的第一阶段。
Atlas Vector Search 索引
您必须使用$vectorSearch
vectorSearch 类型索引定义中的 阶段对要搜索的字段进行索引。您可以在 Atlas Vector Search vectorSearch 类型索引定义中对以下类型的字段进行索引:
要了解有关这些 Atlas Vector Search 字段类型的更多信息,请参阅如何为向量搜索的字段进行索引。
Atlas Vector Search 分数
Atlas Vector Search 为其返回的每个文档分配一个分数,该分数在 0
到 1
之间的固定范围内。对于 cosine
和 dotProduct
的相似度,Atlas Vector Search 使用以下算法对分数进行归一化:
score = (1 + cosine/dot_product(v1,v2)) / 2
分配给返回文档的分数是文档元数据的一部分。要包含每个返回文档的分数以及结果集,请在聚合管道中使用$project
阶段。
要检索 Atlas Vector Search 查询结果的分数,请使用vectorSearchScore
作为$meta表达式中的值。也就是说,在$vectorSearch
阶段之后的$project
阶段, score
字段采用$meta表达式。该表达式需要vectorSearchScore
值来返回向量搜索的文档分数。
例子
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 ])
注意
对数据进行预过滤不会影响 Atlas Vector Search 使用$vectorSearchScore
进行$vectorSearch
查询返回的分数。
Atlas Vector Search 预筛选
$vectorSearch
filter
选项仅匹配 BSON 布尔值、字符串和数值。您 必须 在 vectorSearch 类型索引定义中对要筛选数据的字段作为 筛选器 类型进行索引。筛选数据有助于缩小语义搜索的范围,并确保不会考虑所有向量进行比较。
$vectorSearch
filter
选项仅支持以下比较查询运算符:
注意
Atlas Vector Search 还支持
$eq
的简写形式。在简写形式中,您不需要在查询中指定$eq
。例如,考虑以下$eq
查询:{ "genres": { "$eq": "Comedy" } } 您可以使用
$eq
的简写形式运行前面的查询,方法如下:{ "genres": "Comedy" }
只能匹配单个值,不支持值数组。
$vectorSearch
filter
选项仅支持以下聚合管道操作符:
注意
$vectorSearch
filter
选项不支持其他比较查询和聚合管道操作符。
限制
$vectorSearch
仅适用于运行以下 MongoDB 版本的 Atlas 集群:
v6.0.11
v7.0.2 及更高版本(包括 RC)。
$vectorSearch
不能用于视图定义和以下管道阶段:
$lookup
子管道$unionWith
子管道$facet
管道阶段
您可以将$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 集群并为该集合创建了样本索引,则可以对该集合运行以下查询。
➤ 使用选择语言下拉菜单设置此页面中示例的语言。