Vector Search

Vector Search の手動/自動埋め込みクエリ、ANN/ENN、前処理/後処理フィルタ、Driver 5.10 のネストされたベクトルオプションと Bson 拡張パスを説明します。


基本的な Vector Search

java
Flux<Article> results = dsl
    .executeEntity(Article.class, MongoTemplateName.FRONT)
    .vectorSearch("articles_vector_index")
    .path("embedding")
    .queryVector(embedding)
    .limit(20)
    .approximate(200)
    .findAll()
    .execute();

Vector Search には明示的なインデックス名が必要で、$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

root documentに適用されるDriver 5.10のparentFilterです。

nestedScoreMode

1つのdocumentの複数のmatching embedding scoreをAVGまたはMAXで結合します。

Score / projection / terminal

java
.vectorSearch("articles_vector_index")
.path("embedding")
.queryVector(embedding)
.limit(20)
.approximate(200)
.addFieldsVectorSearchScore("similarity")
.excludes("embedding")
.findAll()
.execute();

findAll / find

Vector resultをFlux/Monoで返します。

count().execute()

vector limit後のpipeline結果数をカウントします。コーパス全体のカウントではありません。

existsQuery().execute()

Vector pipeline結果が存在するか確認します。

Driver-native post stage / options

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の直後に、post-filter/metadata/projectionよりも先に実行されます。driverOptions(...)は便利なAPIにまだない現在/未来のDriverオプションをそのまま使用できるescape hatchです。

© 2026 Byeolnaerim. 無断転載を禁じます。紹介プライバシーポリシー