MongoDB Search

MongoDB中实现复杂的全文搜索或AI驱动的向量检索时,通常需要引入并维护独立的搜索引擎(如Elasticsearch),这会增加系统架构的复杂性,并带来额外的数据同步和运维成本。

MongoDB Search功能通过在MongoDB实例中集成专用的搜索节点(mongot),提供与数据库无缝集成的全文检索和向量检索能力。无需管理外部搜索系统,即可使用MongoDB查询语言(MQL)完成多模态搜索任务,从而简化开发、降低运维负担。

计费说明(免费试用活动)

MongoDB Search功能当前处于邀测阶段,可通过填写表单申请试用。在此期间,开通并使用Search功能不收取mongot搜索节点的费用,只需支付MongoDB主实例的费用。

适用范围

  • 当前仅支持MongoDB 8.0版本的副本集独享型规格实例。暂不支持分片集群

  • 当前仅支持公共云地域。

工作原理

MongoDB Search通过为实例添加专用的mongot搜索节点来隔离搜索负载。该架构确保高强度的搜索任务不影响核心数据库(mongod节点)的请求处理性能。

  • 架构核心mongot节点是承载全文检索和向量检索的独立计算资源,专门负责处理$search(全文检索)和$vectorSearch(向量检索)请求。

  • 数据同步:mongot 节点通过 Change Stream 的方式异步复制 mongod 节点的 oplog 来保持索引数据同步,保证最终一致性。

  • 查询路由:发起包含$search$vectorSearch的聚合查询时,mongos会将搜索部分路由到mongot节点执行,然后将搜索结果与mongod节点上的常规查询结果合并,最终返回统一的结果集。

image

开通Search服务

目的

为已有的MongoDB实例启用Search功能,以创建专用的mongot搜索节点。

操作步骤

  1. 访问MongoDB副本集实例列表,在上方选择资源组和地域,然后单击目标实例ID。

  2. 在左侧导航栏,选择MongoDB Search

  3. MongoDB Search页面,单击立即开通

  4. 开通 Search 面板中,配置搜索节点规格

    参数

    说明

    规格

    mongot搜索节点选择合适的计算规格。可根据预期的查询并发量(QPS)和数据复杂度选择。

    存储

    mongot节点分配用于存储Search索引的磁盘空间。该空间独立于主实例的存储。可根据源数据量和索引复杂度预估,并留出一定余量。

    建议搜索节点规格和存储大小不低于主实例的规格和存储大小,后续可根据实际负载进行变更配置。

  5. 阅读并勾选服务协议

  6. 单击去支付

等待创建成功后,可在 MongoDB Search 页面查看新创建的Search节点信息,并进行变配重启释放操作。

管理Search节点

MongoDB Search 页面,可对已创建的Search节点执行以下操作:

  • 变配:调整mongot节点的计算规格或存储空间以适应业务变化。Search节点数量默认为2个,暂不支持变更。

  • 重启:在排查问题或应用某些配置时,可以重启mongot节点。重启期间,搜索服务将短暂不可用。

  • 释放:如果不再需要Search功能,可释放mongot节点。

    重要

    释放操作会永久删除所有已创建的Search索引,且不可恢复。

创建与使用Search索引

目的

通过创建不同类型的Search索引,启用全文检索或向量检索功能。所有操作均通过MongoDB Shell(mongosh)或兼容的MongoDB驱动程序完成。

前提条件

已使用mongosh或应用程序连接到目标MongoDB实例。

示例一:实现商品评论的全文检索

本示例演示如何为reviews集合创建全文Search索引,并执行关键词查询。

  1. 创建动态映射的Search索引。 dynamic: true使MongoDB自动为集合中的所有字段建立索引,适合快速原型验证。

    // 在名为 'reviews' 的集合上创建一个名为 'reviews_full_text_index' 的Search索引
    db.reviews.createSearchIndex({
      name: "reviews_full_text_index",
      definition: {
        "mappings": {
          "dynamic": true
        }
      }
    });
    
  2. 使用$search聚合阶段查询包含特定关键词的评论。 以下查询将查找comment字段中包含“good”的评论,并返回评论内容、评分和商品ID。

    db.reviews.aggregate([
      {
        $search: {
          index: "reviews_full_text_index", // 指定要使用的Search索引
          text: {
            query: "good", // 查询关键词
            path: "comment"      // 在 'comment' 字段中搜索
          }
        }
      },
      {
        $limit: 5
      },
      {
        $project: {
          _id: 0,
          productId: 1,
          rating: 1,
          comment: 1,
          score: { $meta: "searchScore" } // 返回搜索相关性得分
        }
      }
    ]);
    

示例二:实现基于图片特征的以图搜图

本示例演示如何为存储了图片向量特征的集合images创建向量Search索引,并执行相似性搜索。

  1. 创建向量Search索引。 需指定向量字段的路径、维度(numDimensions)和相似度计算方法(similarity)。

    // 在名为 'images' 的集合上创建一个名为 'vector_index' 的向量索引
    db.images.createSearchIndex(
      "vector_index", 
      "vectorSearch", 
      {
        "fields": [
          {
            "type": "vector",
            "path": "plot_embedding_voyage_3_large",// 存储向量的字段
            "numDimensions": 2048,// 向量的维度
            "similarity": "dotProduct",// 相似度计算方法
            "quantization": "scalar"
          }
        ]
      }
    );
    
  2. 使用$vectorSearch聚合阶段查找与给定图片最相似的图片。 需提供一个查询向量(queryVector),它通常由AI模型根据输入图片生成。

    numCandidates:候选集大小。这是一个性能与召回率的权衡参数。增加此值可以提高召回准确率,但会消耗更多资源并可能增加延迟。

    // 假设 QUERY_EMBEDDING 是由AI模型生成的1024维向量
    const QUERY_EMBEDDING = [0.12, 0.45, -0.23, ...]; // 示例向量,请替换为真实向量数据
    // 根据向量相似复杂度进行检索
    db.images.aggregate([
      {
        "$vectorSearch": {
          "index": "vector_index",
          "path": "plot_embedding_voyage_3_large",
          "queryVector": QUERY_EMBEDDING,
          "numCandidates": 150,
          "limit": 10,
          "quantization": "scalar"
        }
      },
      {
        "$project": {
          "_id": 0,
          "plot": 1,
          "title": 1,
          "score": { $meta: "vectorSearchScore" }
        }
      }
    ])
    

应用于生产环境

监控与运维

  • 监控指标mongot搜索节点暂时没有独立的监控指标。可通过观察主实例的CPU、内存、IO和网络指标来间接评估搜索负载的影响。

  • 日志管理mongot节点暂不支持运行日志、慢日志或审计日志的查看。对于慢查询,建议使用explain()方法分析$search$vectorSearch阶段的执行计划来定位性能瓶颈。

  • 索引管理:可通过db.collection.getSearchIndexes()命令查看已创建的Search索引及其状态。

高可用与故障切换

  • Search节点默认以2节点架构部署。当其中一个节点发生故障时,系统会自动执行故障切换,将流量路由到健康的节点,请确保业务具备重试机制。

备份恢复与数据同步

  • 备份恢复:通过备份文件恢复的新实例不包含原实例的Search索引。需在新实例上重新开通Search服务并重建所有Search索引。

  • 数据迁移:使用数据传输服务(DTS)等工具进行数据迁移或同步时,Search索引不会被同步。需在目标实例上手动创建索引。

常见问题

  • Q:写入数据后多久可以搜索?

    A:数据同步是异步的,通常在秒级延迟内即可搜索。延迟受实例写入负载、文档大小和网络状况等因素影响。

  • Q:在什么情况下会触发索引重建?升降配是否会触发索引重建?

    A:当更改索引定义时,mongot会自动在后台重建新的索引,此时旧索引仍可支持查询, 一旦新索引完成构建,旧索引就不再可用。搜索节点升降配和索引重建并没有直接关联。