Docs 菜单

Docs 主页启动和管理 MongoDBMongoDB Atlas

knnBeta

在此页面上

  • 定义
  • 语法
  • 选项
  • 行为
  • 举例
knnBeta

knnBeta操作符使用 Hierarchical Navigable Small Worlds 算法来执行语义搜索。您可以使用 Atlas Search 对 kNN 查询的支持来搜索与所选产品相似的产品、搜索图像等。

knnBeta 通过以下语法实现:

1{
2 $search: {
3 "index": "<index name>", // optional, defaults to "default"
4 "knnBeta": {
5 "vector": [<array-of-numbers>],
6 "path": "<field-to-search>",
7 "filter": {<filter-specification>},
8 "k": <number>,
9 "score": {<options>}
10 }
11 }
12}
字段
类型
说明
必要性
filter
文档
任何 Atlas Search 操作符,根据元数据或特定搜索条件筛选文档,有助于缩小向量搜索的范围。
Optional
k
数字
要返回的最近邻数量。您可以指定一个大于要返回的文档数 ( $limit ) 的数字,以提高准确性。
必需
path
字符串
要搜索的 knnVector 类型索引字段。有关详细信息,请参阅路径构造
必需
score
文档
分配给结果中匹配文档的分数。要了解更多信息,请参阅评分行为。
Optional
vector
数字数组
表示查询向量的 BSON 类型 intdouble 的数字数组。数组大小必须与字段的索引中指定的向量 dimensions 的数量相匹配。
必需

只能对索引为 Atlas Search 类型 knnVector 的字段运行 kNN 查询。

您可以在 阶段之后使用$limit $search来限制knnBeta 查询结果中的文档数量。我们建议将 的值设置为高于k $limit的值。这种过度请求模式是在近似最近邻搜索中平衡延迟和召回的主要方法。根据经验,我们发现5 -10 的乘数对于许多使用案例效果良好,但我们建议根据特定数据集进行调整。

例子

以下查询查找与该查询最近的 150 个邻居,并将剩余结果数限制为 50

1db.<collection>.aggregate({
2 "$search": {
3 "knnBeta": {
4 "vector": <array-of-numbers-to-search>,
5 "path": <indexed-field-to-search>,
6 "k": 150
7 }
8 }
9},
10{
11 "$limit": 50
12})

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

您可以在 阶段使用score 字段和 $meta 表达式searchScore $project来返回结果中文档的分数。

Atlas Search 仅在从 01 的固定范围内对 kNN 查询结果进行评分。对于 cosinedotProduct相似度,Atlas Search 使用以下算法对分数进行归一化:

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

knnBeta 操作符必须是查询中的顶级操作符,因此,不能在以下情况使用 knnBeta 操作符:

不能使用 knnBeta 操作符查询使用 vectorSearch 类型索引的字段。不能将 $search 排序选项与 knnBeta 操作符结合使用。

我们不建议在 阶段之后使用$limit $search$skip 对 Atlas Search 结果进行分页。

以下查询使用 knnBeta 操作符搜索样本 sample_mflix.embedded_movies 集合。查询搜索 plot_embedding 字段,其中包含使用 OpenAI 的 text-embedding-ada-002 嵌入模型创建的嵌入。如果已将样本集合添加到 Atlas 集群,并为该集合创建了样本索引定义,则可以切换到 sample_mflix 数据库并对该集合运行以下查询。

← in