Vector Search
อธิบายการค้นหา Vector ด้วย query manual/Automated Embedding, ANN/ENN, pre/post filter, ตัวเลือก nested vector ของ Driver 5.10 และเส้นทางการขยาย Bson.
การค้นหา Vector พื้นฐาน.
Flux<Article> results = dsl
.executeEntity(Article.class, MongoTemplateName.FRONT)
.vectorSearch("articles_vector_index")
.path("embedding")
.queryVector(embedding)
.limit(20)
.approximate(200)
.findAll()
.execute();การค้นหา Vector ต้องการชื่อดัชนีที่ชัดเจนและ $vectorSearch จะเป็น stage แรกของการรวม.
Query vector / Automated Embedding.
queryVector(float[]/double[]/Collection<Double>)
ส่งเวกเตอร์ที่สร้างโดยแอปพลิเคชัน.
queryVector(BinaryVector).
ใช้การแสดงผลเวกเตอร์ไบนารีที่กระชับของ MongoDB Driver โดยตรง.
query(String).
ส่ง query text เองไปยังดัชนี Automated Embedding ของ MongoDB.
query(VectorSearchQuery).
เป็น escape hatch ที่เข้ากันได้ในอนาคตสำหรับการส่งประเภท query ที่เป็น native ของ Driver โดยตรง.
.vectorSearch("articles_auto_embedding")
.path("content")
.query("reactive mongodb search")
.model("model-name")
.limit(20)
.approximate(200)
.findAll()
.execute();ฟังก์ชันที่ให้ DSL core เรียกผู้ให้บริการ embedding ภายนอกเพื่อสร้างเวกเตอร์ไม่ได้รวมอยู่ด้วย เวกเตอร์แบบ manual จะถูกสร้างโดยแอปพลิเคชันที่เรียกและส่งไปยัง queryVector(...).
ANN / ENN.
ANN.
ใช้ approximate(numCandidates) หรือ numCandidates(...) ใน ANN ต้องการจำนวนผู้สมัคร.
ENN.
ใช้ exact() หรือ exact(true) เมื่อเปิดใช้งาน exact ค่าของ numCandidates ที่มีอยู่จะถูกลบออก.
Pre-filter / post-filter.
.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().
เป็น pre-filter ที่ส่งผลต่อการเลือกผู้สมัครเองใน $vectorSearch.filter.
fields(...).
post-filter ทั่วไปหลัง $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.
filter ของเอกสารใบปลิวใน nested embedding.
parentFilter / parentFilterFields.
parentFilter ที่ใช้กับเอกสารหลักใน Driver 5.10
nestedScoreMode
รวมคะแนน embedding ที่ตรงกันหลายคะแนนของเอกสารหนึ่งด้วย AVG หรือ MAX
Score / projection / terminal
.vectorSearch("articles_vector_index")
.path("embedding")
.queryVector(embedding)
.limit(20)
.approximate(200)
.addFieldsVectorSearchScore("similarity")
.excludes("embedding")
.findAll()
.execute();findAll / find
ส่งคืนผลลัพธ์เวกเตอร์เป็น Flux/Mono
count().execute()
นับจำนวนผลลัพธ์ของ pipeline หลังจากเวกเตอร์ลิมิต ไม่ใช่จำนวนทั้งหมดของ corpus
existsQuery().execute()
ตรวจสอบว่ามีผลลัพธ์ของ pipeline เวกเตอร์หรือไม่
Driver-native post stage / options
.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(...) เป็น escape hatch ที่สามารถใช้ตัวเลือก Driver ปัจจุบัน/อนาคตที่ยังไม่มีใน convenience API ได้