MongoDB 7.0+原生支持多维向量搜索,依赖$vectorSearch聚合阶段和专用ANN索引;需满足四条件:版本≥7.0.2并启用功能、字段为定长double数组、具备Project Data Access Admin权限、IP白名单(Atlas)或加载vectorSearch插件(本地);查询必须置于aggregate管道首或次阶段,维度严格匹配且不归一化,索引不继承分片策略。
MongoDB 从 7.0 开始原生支持多维向量搜索,核心依赖 $vectorSearch 聚合阶段和专用的 vector search 索引 —— 它不是靠普通 B-tree 或文本索引模拟,而是基于 ANN(近似最近邻)算法构建的独立索引结构,能直接处理高维浮点数组(如 384、768、1536 维),无需降维或自建相似度计算逻辑。
创建 vector search 索引前必须确认的 4 个条件
很多报错(比如 "vector search is not enabled" 或 "no index found for $vectorSearch")都源于这几点没对齐:
- 集群版本 ≥ 7.0.2(Atlas 上需开启 Vector Search 功能;本地 Community 版需显式安装
search和vectorSearch插件) - 集合中已存在一个
array类型字段,且每个元素是double,长度固定(例如[0.12, -0.88, 0.45, ...]) - 你有
Project Data Access Admin权限,否则createSearchIndexes命令会拒绝执行 - IP 地址已在 Atlas 访问列表中放行(本地部署可忽略,但需确认 mongod 启动时加载了 vector search 模块)
$vectorSearch 查询必须用聚合管道,不能单独使用
它不是像 find() 那样的独立操作,必须嵌在 aggregate() 中,且只能作为第一个或第二个阶段(受 pipeline 优化限制)。常见错误是把它当 filter 写进 find({ $vectorSearch: { ... } }) —— 这会直接报语法错误。
正确写法示例(以 768 维嵌入为例):
db.movies.aggregate([
{
$vectorSearch: {
index: "vector_index",
path: "plot_embedding",
queryVector: [/* your 768-float array */],
limit: 10,
numCandidates: 100
}
},
{ $project: { title: 1, plot: 1, score: { $meta: "vectorSearchScore" } } }
])
注意:numCandidates 不是返回数,而是参与粗筛的候选数量,调太小会漏结果,太大影响延迟;默认 100 是平衡点。
火山方舟
火山引擎一站式大模型服务平台,已接入满血版DeepSeek
下载
维度必须严格匹配,且不支持动态长度
索引一旦建好,path 字段里所有向量的长度必须完全一致。MongoDB 不做截断、补零或归一化 —— 如果你混用了 384 维和 768 维的 embedding,查询时部分文档会因维度不匹配被静默跳过,且不报错。
建索引时需明确声明维度(虽然当前版本不强制校验,但驱动或 Atlas UI 会提示):
在 Atlas UI 创建索引时,字段类型选 vector,并填入具体维度(如 768);用命令行则靠你确保数据清洗干净:
- 插入前用
$size校验:db.movies.find({ "plot_embedding.767": { $exists: true }, "plot_embedding.768": { $exists: false } }) - 避免用
NumberDecimal或整数存 embedding —— 必须是double - 不同 embedding 模型(如 voyage-3-large vs. text-embedding-3-small)输出维度不同,别混用同一索引
最容易被忽略的是:vector search 索引不继承 collection 的分片策略,即使集合已分片,vector search 也只在主分片上构建索引(Atlas 自动处理,但自托管需手动协调)。如果数据量大且未预估好分片键,可能造成单点 ANN 计算瓶颈。