此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Data MongoDB 5.0.4spring-doc.cadn.net.cn

MongoDB 搜索

MongoDB 允许用户使用专用的搜索索引执行关键词(或词法)搜索以及向量搜索。spring-doc.cadn.net.cn

向量搜索

MongoDB 向量搜索使用 $vectorSearch 聚合阶段对专用索引执行查询。 有关 vectorSearch 索引的要求和限制,请参阅 MongoDB 官方文档以了解更多信息。spring-doc.cadn.net.cn

管理向量索引

SearchIndexOperationsProvider 实现的 MongoTemplateSearchIndexOperations 的入口点,提供了多种用于管理向量索引的方法。spring-doc.cadn.net.cn

以下代码片段展示了如何为一个集合创建向量索引spring-doc.cadn.net.cn

创建向量索引
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 状态表示该索引已准备好接受查询。spring-doc.cadn.net.cn

查询向量索引

可以通过 VectorSearchOperation 使用 MongoOperations 执行聚合操作来查询向量索引,如下例所示。spring-doc.cadn.net.cn

查询向量索引
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 = "…​")