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

运行MongoDB Vector Search 查询

在本指南中,您可以学习;了解如何使用 Mongoid运行MongoDB Vector Search 查询。 MongoDB Vector Search 允许您使用向量嵌入根据文档的语义查询文档。

Mongoid 提供了vector_search $vectorSearch方法,该方法可为您构建并运行 聚合阶段。要学习;了解有关$vectorSearch 聚合阶段的更多信息,请参阅 聚合操作指南。

注意

部署兼容性

要使用MongoDB Vector Search,必须连接到MongoDB Atlas 群集或运行MongoDB 8.2 或更高版本的自托管部署。

要学习;了解有关MongoDB Vector Search 的更多信息,请参阅Atlas文档中的MongoDB Vector Search 概述

在运行MongoDB Vector Search查询之前,必须在模型上定义向量字段和向量搜索索引,然后在集合上创建索引。要学习;了解如何声明和创建向量搜索索引,请参阅 索引指南中的MongoDB Vector Search 索引部分。

本指南中的示例使用以下 Movie 模型,该模型映射到 sample_mflix数据库中的 embedded_movies集合。 plot_embedding字段存储每部电影情节的向量嵌入。

class Movie
include Mongoid::Document
store_in collection: "embedded_movies", database: "sample_mflix"
field :title, type: String
field :plot, type: String
field :year, type: Integer
field :plot_embedding, type: Array
# Declare a vector search index on the `plot_embedding` field. The `_id`
# and `year` filter fields enable instance-level and filtered queries.
vector_search_index :plot_embedding_index,
fields: [
{
type: "vector",
path: "plot_embedding",
numDimensions: 1536,
similarity: "cosine"
},
{
type: "filter",
path: "_id"
},
{
type: "filter",
path: "year"
}
]
end

提示

Atlas样本数据

要学习;了解如何加载sample_mflix 示例数据,请参阅Atlas文档中的“将数据加载到Atlas”教程。

要运行MongoDB Vector Search查询,请对模型调用 vector_search 类方法,并将查询向量作为第一个参数传递。查询向量是表示搜索输入的向量嵌入。

以下代码示例对 plot_embedding字段运行MongoDB Vector Search查询,并打印每部匹配电影的标题。由于 Movie 模型仅声明一个向量搜索索引,因此 Mongoid 会自动选择要使用的索引和向量字段。

# The query vector must have the same number of dimensions as the
# vector search index (1536, in this example).
query_vector = [ -0.0016261312, -0.028070757, -0.011342932, ..., -0.009710136 ]
movies = Movie.vector_search(query_vector, limit: 5)
movies.each do |movie|
puts movie.title
end
Thrill Seekers
About Time
The Time Machine
Timecop
Crusade in Jeans

vector_search 方法返回 Movie 文档的大量。默认下,它返回 10 个最相似的文档。要更改结果数,设立limit 选项。前面的示例指定了 5 个结果的限制。

vector_search 返回的每个文档都有一个 vector_search_score 属性,该属性描述文档与查询向量的匹配程度。分数越高表示匹配度越接近。

以下代码运行与前面的示例相同的查询,但打印每部匹配电影的标题和分数:

movies = Movie.vector_search(query_vector, limit: 5)
movies.each do |movie|
puts "#{movie.title}: #{movie.vector_search_score}"
end
Thrill Seekers: 0.9253387451171875
About Time: 0.9246978759765625
The Time Machine: 0.9229583740234375
Timecop: 0.9228057861328125
Crusade in Jeans: 0.9222259521484375

您还可以在文档实例上调用 vector_search 方法,以查找与该文档相似的文档。当您对文档调用 vector_search 时,Mongoid 会使用文档自身存储的向量作为查询向量,并从结果中排除文档本身。

以下代码查找与现有 Movie文档最相似的五部电影:

movie = Movie.find_by(title: "About Time")
neighbors = movie.vector_search(limit: 5)
neighbors.each do |neighbor|
puts neighbor.title
end
Thrill Seekers
The Time Machine
Timecop
Crusade in Jeans
Frequency

您可以将以下关键字参数传递给 vector_search 方法来自定义查询:

选项
类型
说明
默认值

index

String or Symbol

要使用的向量搜索索引的名称。仅当模型声明多个向量搜索索引为必填项。

从模型推断

path

String or Symbol

包含向量嵌入的字段。仅当无法从索引定义推断字段时为必填项。

从索引推断

limit

Integer

要返回的最大文档数。

10

num_candidates

Integer

搜索期间要考虑的最近邻数量。

limit * 10

filter

Hash

用于在搜索之前对文档进行预过滤的查询。

不过滤

pipeline

Array

在向量搜索之后附加的其他聚合阶段。

无需额外阶段

以下代码运行MongoDB Vector Search查询,该查询考虑 150 个候选,并仅返回 2000 年之后上映的电影:

movies = Movie.vector_search(
query_vector,
limit: 5,
num_candidates: 150,
filter: { year: { "$gt" => 2000 } }
)

$vectorSearch要学习;了解有关这些选项的更多信息,请参阅Atlas文档中 操作符参考的字段部分。

要学习;了解如何声明和创建向量搜索索引,请参阅 索引指南中的MongoDB Vector Search 索引部分。

要进一步学习;了解本指南中提到的概念,请参阅Atlas文档中的以下页面:

要学习;了解有关本指南中提到的方法的更多信息,请参阅以下API文档: