MongoDB全文索引仅支持string类型字段,多字段需显式设权重,中文搜索须指定default_language:"zh"或用短语匹配,且不提供语义相似性检索。
MongoDB 的全文索引不依赖特殊文档结构,但字段内容质量直接影响搜索效果。它只对 string 类型字段生效,其他类型(如 number、array、object)会被忽略或报错。
如果你的文档里存的是 "content": ["分布式", "系统"](数组),或者 "content": 123(数字),createIndex({ content: "text" }) 不会报错,但后续 $text 查询完全匹配不到——因为 MongoDB 文本索引只解析字符串内容,其余类型跳过。
"content": "分布式系统设计需考虑容错与一致性"
"content": ["分布式系统", "容错"](数组)、"content": null、"content": {}
string,有时是 null 或 missing,建议用 sparse: true 选项避免索引膨胀想让 title 和 content 都参与搜索,不能只写 { title: "text", content: "text" } 就完事。默认权重都是 1,但实际中标题通常比正文更关键,需要人工调权。
db.articles.createIndex({ title: "text", content: "text" }, { weights: { title: 10, content: 5 } })
$meta: "textScore" 排序结果,不影响是否命中;值越大,该字段匹配词贡献的分数越高weights 中列出的字段,权重默认为 1;但字段名必须出现在索引定义中,否则不被索引MongoDB 默认使用英文分词规则(按空格+标点切词),直接搜 "分布式系统" 会拆成 "分布式" 和 "系统",但中文没有空格,导致查不到完整短语。
default_language: "zh":db.articles.createIndex({ content: "text" }, { default_language: "zh" })
db.articles.find({ $text: { $search: ""分布式系统"" } }),但仅对已索引的连续字符串有效,无法解决“分布式”和“系统”中间有其它字的情况default_language: "none" 会关闭所有语言处理(包括停用词过滤),适合技术术语混杂场景,但可能引入噪声真正容易被忽略的是:文本索引本身不解决语义相似性,它只是词频+位置匹配。如果你需要“Java”匹配“Java编程”,得靠预处理(比如统一加后缀)或额外引入向量检索;而权重调参、语言设置、字段类型校验,这三步漏掉任何一项,$text 查询就大概率返回空或排序错乱。