Overview
在本指南中,您可以学习;了解如何使用 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
运行向量搜索查询
要运行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 方法来自定义查询:
选项 | 类型 | 说明 | 默认值 |
|---|---|---|---|
|
| 要使用的向量搜索索引的名称。仅当模型声明多个向量搜索索引为必填项。 | 从模型推断 |
|
| 包含向量嵌入的字段。仅当无法从索引定义推断字段时为必填项。 | 从索引推断 |
|
| 要返回的最大文档数。 |
|
|
| 搜索期间要考虑的最近邻数量。 |
|
|
| 用于在搜索之前对文档进行预过滤的查询。 | 不过滤 |
|
| 在向量搜索之后附加的其他聚合阶段。 | 无需额外阶段 |
以下代码运行MongoDB Vector Search查询,该查询考虑 150 个候选,并仅返回 2000 年之后上映的电影:
movies = Movie.vector_search( query_vector, limit: 5, num_candidates: 150, filter: { year: { "$gt" => 2000 } } )
更多信息
要学习;了解如何声明和创建向量搜索索引,请参阅 索引指南中的MongoDB Vector Search 索引部分。
要进一步学习;了解本指南中提到的概念,请参阅Atlas文档中的以下页面:
API 文档
要学习;了解有关本指南中提到的方法的更多信息,请参阅以下API文档: