|
此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Data MongoDB 5.0.4! |
MongoDB 搜索
MongoDB 允许用户使用专用的搜索索引执行关键词(或词法)搜索以及向量搜索。
向量搜索
MongoDB 向量搜索使用 $vectorSearch 聚合阶段对专用索引执行查询。
有关 vectorSearch 索引的要求和限制,请参阅 MongoDB 官方文档以了解更多信息。
管理向量索引
由 SearchIndexOperationsProvider 实现的 MongoTemplate 是 SearchIndexOperations 的入口点,提供了多种用于管理向量索引的方法。
以下代码片段展示了如何为一个集合创建向量索引
创建向量索引
-
Java
-
Mongo Shell
VectorIndex index = new VectorIndex("vector_index")
.addVector("plotEmbedding", vector -> vector.dimensions(1536).similarity(COSINE)) (1)
.addFilter("year"); (2)
mongoTemplate.searchIndexOps(Movie.class) (3)
.createIndex(index);
| 1 | 向量索引可以覆盖多个向量嵌入,这些嵌入可通过 addVector 方法添加。 |
| 2 | 向量索引在执行查询时可以包含额外的字段,以缩小搜索结果范围。 |
| 3 | 获取绑定到 SearchIndexOperations 类型的 Movie,该类型用于字段名称映射。 |
db.movie.createSearchIndex("movie", "vector_index",
{
"fields": [
{
"type": "vector",
"numDimensions": 1536,
"path": "plot_embedding", (1)
"similarity": "cosine"
},
{
"type": "filter",
"path": "year"
}
]
}
)
| 1 | 字段名 plotEmbedding 根据 plot_embedding 注解被映射为 @Field(name = "…")。 |
向量索引一旦创建,虽然 exists 检查会返回 true,但并不会立即可用。
搜索索引的实际状态可以通过 SearchIndexOperations#status(…) 获取。
READY 状态表示该索引已准备好接受查询。
查询向量索引
可以通过 VectorSearchOperation 使用 MongoOperations 执行聚合操作来查询向量索引,如下例所示。
查询向量索引
-
Java
-
Mongo Shell
VectorSearchOperation search = VectorSearchOperation.search("vector_index") (1)
.path("plotEmbedding") (2)
.vector( ... )
.numCandidates(150)
.limit(10)
.withSearchScore("score"); (3)
AggregationResults<MovieWithSearchScore> results = mongoTemplate
.aggregate(newAggregation(Movie.class, search), MovieWithSearchScore.class);
| 1 | 由于一个集合可能包含多个向量索引,请提供要查询的向量索引的名称。 |
| 2 | 用于比较的路径名称。 |
| 3 | 可选地将具有指定名称的搜索得分添加到结果文档中。 |
db.embedded_movies.aggregate([
{
"$vectorSearch": {
"index": "vector_index",
"path": "plot_embedding", (1)
"queryVector": [ ... ],
"numCandidates": 150,
"limit": 10
}
},
{
"$addFields": {
"score": { $meta: "vectorSearchScore" }
}
}
])
| 1 | 字段名 plotEmbedding 根据 plot_embedding 注解被映射为 @Field(name = "…")。 |