目录
什么是 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 Search 或 Elasticsearch。
- MongoDB 的文本搜索目前对中文、日文等分词处理效果不如英文好,可配合外部分词引擎增强精度。
参考资料
更多数据库技术与开发实战内容,欢迎访问 www.52kanjuqing.com。
发表回复