向量搜索
解释 Vector Search 的手动/自动嵌入查询、ANN/ENN、预/后过滤器、Driver 5.10 嵌套向量选项和 Bson 扩展路径。
基本向量搜索。
Flux<Article> results = dsl
.executeEntity(Article.class, MongoTemplateName.FRONT)
.vectorSearch("articles_vector_index")
.path("embedding")
.queryVector(embedding)
.limit(20)
.approximate(200)
.findAll()
.execute();向量搜索需要显式的索引名称,$vectorSearch 是聚合的第一个阶段。
查询向量 / 自动嵌入。
queryVector(float[]/double[]/Collection<Double>)
传递应用程序生成的向量。
queryVector(BinaryVector)。
直接使用 MongoDB 驱动程序的紧凑二进制向量表示。
query(String)。
将查询文本本身传递给 MongoDB 自动嵌入索引。
query(VectorSearchQuery)。
直接传递驱动程序原生查询类型的未来兼容逃生口。
.vectorSearch("articles_auto_embedding")
.path("content")
.query("reactive mongodb search")
.model("model-name")
.limit(20)
.approximate(200)
.findAll()
.execute();DSL 核心不包含调用外部嵌入提供者生成向量的功能。手动向量由调用应用程序生成并传递给 queryVector(...)。
ANN / ENN。
ANN。
使用 approximate(numCandidates) 或 numCandidates(...)。在 ANN 中需要候选计数。
ENN。
使用 exact() 或 exact(true)。启用 exact 后,现有的 numCandidates 值将被移除。
预过滤器 / 后过滤器。
.vectorSearch("articles_vector_index")
.path("embedding")
.queryVector(embedding)
.limit(20)
.approximate(200)
.filter(filter -> filter
.and(f -> f.fields(
pair("status", "PUBLISHED"),
pair("deleted", false)
))
)
.fields(pair("category", "TECH"))
.findAll()
.execute();filter()/filterFields()。
作为进入 $vectorSearch.filter 的预过滤器,影响候选选择本身。
fields(...)。
在 $vectorSearch 后的常规 $match 后过滤器。
嵌套 / 数组嵌入 (Driver 5.10)。
Flux<Article> result = dsl
.executeEntity(Article.class, MongoTemplateName.FRONT)
.vectorSearch("articles_vector_index")
.path("chunks.embedding")
.queryVector(embedding)
.limit(20)
.exact()
.filter(f -> f.fields(
pair("chunks.kind", "BODY")
))
.parentFilter(f -> f.fields(
pair("tenantId", tenantId)
))
.nestedScoreMode(VectorSearchScoreMode.AVG)
.findAll()
.execute();filter / filterFields。
嵌套嵌入的叶文档过滤器。
parentFilter / parentFilterFields。
适用于根文档的 Driver 5.10 parentFilter。
nestedScoreMode
将一个文档的多个匹配嵌入分数结合为 AVG 或 MAX。
分数 / 投影 / 终端
.vectorSearch("articles_vector_index")
.path("embedding")
.queryVector(embedding)
.limit(20)
.approximate(200)
.addFieldsVectorSearchScore("similarity")
.excludes("embedding")
.findAll()
.execute();findAll / find
将 Vector 结果返回为 Flux/Mono。
count().execute()
在向量限制之后计算管道结果的数量。不是整个语料库的计数。
existsQuery().execute()
检查是否存在向量管道结果。
Driver-native 后阶段 / 选项
.vectorSearch("articles_vector_index")
.path("embedding")
.queryVector(vector)
.limit(20)
.exact()
.stage(Aggregates.score("$rating"))
.driverOptions(options -> options
.parentFilter(Filters.eq("tenantId", tenantId))
.nestedOptions(
VectorSearchNestedOptions.vectorSearchNestedOptions()
.scoreMode(VectorSearchScoreMode.AVG)
)
)
.findAll()
.execute();stage(Bson) 在 $vectorSearch 之后立即执行,优先于后过滤器/元数据/投影。driverOptions(...) 是一个逃生舱,可以直接使用当前/未来 Driver 选项,尽管它们尚未在便利 API 中。