向量搜索

說明 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()

在 vector 限制之後計算管道結果數量。這不是整個語料庫的計數。

existsQuery().execute()

檢查是否存在 Vector 管道結果。

Driver-native post 階段 / 選項

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. 版權所有。介紹隱私政策