Vector Search

Vector Search의 manual/Automated Embedding query, ANN/ENN, pre/post filter, Driver 5.10 nested vector 옵션과 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는 명시적인 index 이름이 필요하고 $vectorSearch가 aggregation 첫 stage가 됩니다.

Query vector / Automated Embedding

queryVector(float[]/double[]/Collection<Double>)

애플리케이션에서 생성한 vector를 전달합니다.

queryVector(BinaryVector)

MongoDB Driver의 compact binary vector 표현을 직접 사용합니다.

query(String)

MongoDB Automated Embedding index에 query text 자체를 전달합니다.

query(VectorSearchQuery)

Driver-native query type을 직접 전달하는 미래 호환 escape hatch입니다.

java
.vectorSearch("articles_auto_embedding")
.path("content")
.query("reactive mongodb search")
.model("model-name")
.limit(20)
.approximate(200)
.findAll()
.execute();

DSL 코어가 외부 embedding provider를 호출해 vector를 생성하는 기능은 포함하지 않습니다. manual vector는 호출 애플리케이션에서 생성해 queryVector(...)에 전달합니다.

ANN / ENN

ANN

approximate(numCandidates) 또는 numCandidates(...)를 사용합니다. ANN에서는 candidate count가 필요합니다.

ENN

exact() 또는 exact(true)를 사용합니다. exact를 활성화하면 기존 numCandidates 값은 제거됩니다.

Pre-filter / post-filter

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에 들어가는 pre-filter로 candidate 선택 자체에 영향을 줍니다.

fields(...)

$vectorSearch 뒤의 일반 $match post-filter입니다.

Nested / array embedding (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

nested embedding의 leaf document filter입니다.

parentFilter / parentFilterFields

root document에 적용되는 Driver 5.10 parentFilter입니다.

nestedScoreMode

한 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 결과 수를 count합니다. corpus 전체 count가 아닙니다.

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(...)는 convenience API에 아직 없는 현재/미래 Driver option을 그대로 사용할 수 있는 escape hatch입니다.

© 2026 Byeolnaerim. All rights reserved.소개개인정보처리방침