Docs 主页 → 启动和管理 MongoDB → MongoDB 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 }
选项
行为
只能对索引为 Atlas Search 类型 knnVector 的字段运行 kNN 查询。
您可以在 阶段之后使用$limit
$search
来限制knnBeta
查询结果中的文档数量。我们建议将 的值设置为高于k
$limit
的值。这种过度请求模式是在近似最近邻搜索中平衡延迟和召回的主要方法。根据经验,我们发现5 -10 的乘数对于许多使用案例效果良好,但我们建议根据特定数据集进行调整。
例子
以下查询查找与该查询最近的 150
个邻居,并将剩余结果数限制为 50
。
1 db.<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 仅在从 0
到 1
的固定范围内对 kNN 查询结果进行评分。对于 cosine
和 dotProduct
的相似度,Atlas Search 使用以下算法对分数进行归一化:
score = (1 + cosine/dot_product(v1,v2)) / 2
限制
knnBeta
操作符必须是查询中的顶级操作符,因此,不能在以下情况使用 knnBeta
操作符:
embeddedDocument 操作符
compound 运算符
分面收集器
不能使用 knnBeta
操作符查询使用 vectorSearch 类型索引的字段。不能将 $search
排序选项与 knnBeta
操作符结合使用。
举例
以下查询使用 knnBeta
操作符搜索样本 sample_mflix.embedded_movies
集合。查询搜索 plot_embedding
字段,其中包含使用 OpenAI 的 text-embedding-ada-002
嵌入模型创建的嵌入。如果已将样本集合添加到 Atlas 集群,并为该集合创建了样本索引定义,则可以切换到 sample_mflix
数据库并对该集合运行以下查询。