向量搜索

解释 Vector Search 的手动/自动嵌入查询、ANN/ENN、预/后过滤器、Driver 5.10 嵌套向量选项和 Bson 扩展路径。


基本向量搜索。

java
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)。

直接传递驱动程序原生查询类型的未来兼容逃生口。

java
.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 值将被移除。

预过滤器 / 后过滤器。

java
.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)。

java
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。

分数 / 投影 / 终端

java
.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 后阶段 / 选项

java
.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 中。

© 2026 Byeolnaerim. 保留所有权利.介绍隐私政策