目录

  1. 什么是 MongoDB 全文检索?
  2. 启用全文检索
  3. 使用 $text 查询
  4. 文本索引的语言选项
  5. 全文检索的评分机制
  6. 限制与注意事项
  7. 参考资料

什么是 MongoDB 全文检索?

MongoDB 提供原生的**全文检索(Full-Text Search)功能,允许用户在集合中的字符串字段上进行关键词匹配。该功能基于文本索引(Text Index)**实现,支持语言处理、停用词过滤、词干提取等自然语言处理功能。

相比传统的字段匹配(如使用 $regex),全文检索在处理自然语言查询、模糊匹配和多关键词搜索方面更高效。


启用全文检索

要使用全文检索,首先需要为集合中的字段创建文本索引。语法如下:

db.collection.createIndex({ fieldName: "text" });

例如:

db.articles.createIndex({ title: "text", content: "text" });

你也可以为多个字段建立复合文本索引:

db.posts.createIndex({
  title: "text",
  description: "text"
});


使用 $text 查询

创建好索引后,可以使用 $text 运算符进行查询:

db.articles.find({
  $text: { $search: "MongoDB 教程" }
});

支持短语匹配与排除:

// 匹配“MongoDB”或“教程”
{ $text: { $search: "MongoDB 教程" } }

// 匹配“MongoDB”但排除“教程”
{ $text: { $search: "MongoDB -教程" } }

// 精确匹配短语
{ $text: { $search: "\"MongoDB 教程\"" } }


文本索引的语言选项

MongoDB 的全文检索支持多种自然语言,默认使用集合的语言(如 en)。你可以为文档设置不同语言:

db.articles.insertOne({
  title: "学习 MongoDB",
  content: "适用于中文用户的入门教程",
  language: "zh"
});

创建索引时指定语言字段:

db.articles.createIndex(
  { content: "text" },
  { default_language: "zh", language_override: "language" }
);


全文检索的评分机制

MongoDB 会自动为 $text 查询计算每条结果的相关性得分(relevance score),可用于排序:

db.articles.find(
  { $text: { $search: "数据库 教程" } },
  { score: { $meta: "textScore" } }
).sort({ score: { $meta: "textScore" } });


限制与注意事项

  • 一个集合中只能有一个文本索引。
  • 文本索引不支持 通配符字段
  • MongoDB 的全文检索功能适用于中小型项目;对于大规模复杂场景,建议使用 Atlas SearchElasticsearch
  • MongoDB 的文本搜索目前对中文、日文等分词处理效果不如英文好,可配合外部分词引擎增强精度。

参考资料

更多数据库技术与开发实战内容,欢迎访问 www.52kanjuqing.com