在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节点上的常规查询结果合并,最终返回统一的结果集。
开通Search服务
目的
为已有的MongoDB实例启用Search功能,以创建专用的mongot搜索节点。
操作步骤
访问MongoDB副本集实例列表,在上方选择资源组和地域,然后单击目标实例ID。
在左侧导航栏,选择MongoDB Search。
在MongoDB Search页面,单击立即开通。
在 开通 Search 面板中,配置搜索节点规格。
参数
说明
规格
为
mongot搜索节点选择合适的计算规格。可根据预期的查询并发量(QPS)和数据复杂度选择。存储
为
mongot节点分配用于存储Search索引的磁盘空间。该空间独立于主实例的存储。可根据源数据量和索引复杂度预估,并留出一定余量。建议搜索节点规格和存储大小不低于主实例的规格和存储大小,后续可根据实际负载进行变更配置。
阅读并勾选服务协议。
单击去支付。
等待创建成功后,可在 MongoDB Search 页面查看新创建的Search节点信息,并进行变配、重启、释放操作。
管理Search节点
在 MongoDB Search 页面,可对已创建的Search节点执行以下操作:
变配:调整
mongot节点的计算规格或存储空间以适应业务变化。Search节点数量默认为2个,暂不支持变更。重启:在排查问题或应用某些配置时,可以重启
mongot节点。重启期间,搜索服务将短暂不可用。释放:如果不再需要Search功能,可释放
mongot节点。重要释放操作会永久删除所有已创建的Search索引,且不可恢复。
创建与使用Search索引
目的
通过创建不同类型的Search索引,启用全文检索或向量检索功能。所有操作均通过MongoDB Shell(mongosh)或兼容的MongoDB驱动程序完成。
前提条件
已使用mongosh或应用程序连接到目标MongoDB实例。
示例一:实现商品评论的全文检索
本示例演示如何为reviews集合创建全文Search索引,并执行关键词查询。
创建动态映射的Search索引。
dynamic: true使MongoDB自动为集合中的所有字段建立索引,适合快速原型验证。// 在名为 'reviews' 的集合上创建一个名为 'reviews_full_text_index' 的Search索引 db.reviews.createSearchIndex({ name: "reviews_full_text_index", definition: { "mappings": { "dynamic": true } } });使用
$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索引,并执行相似性搜索。
创建向量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" } ] } );使用
$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会自动在后台重建新的索引,此时旧索引仍可支持查询, 一旦新索引完成构建,旧索引就不再可用。搜索节点升降配和索引重建并没有直接关联。