定义文本索引
为简单起见,让我们考虑一个使用以下设置的博客应用程序示例:
- 数据库名称:cosmicworks
- 集合名称:products
此示例应用程序将文章存储为具有以下结构的文档:
{
"_id": ObjectId("617a34e7a867530bff1b2346"),
"title": "Mongo DB - A Game Changer",
"content": "Mongo DB is a globally distributed, multi-model database service.",
"author": "John Doe",
"category": "Technology",
"published": true
}
1. 使用 createIndex 方法与 text 选项,在 title 字段上创建文本索引。
use cosmicworks;
db.products.createIndex({ title: "text" })
备注:
虽然每个集合只能定义一个文本索引,但可以在多个字段上创建文本索引,从而能够跨文档中的不同字段执行文本搜索。
2. (可选)创建一个索引,以支持对 title 和 content 字段进行搜索。
db.products.createIndex({ title: "text", content: "text" })
配置文本索引选项
MongoDB 中的文本索引附带多个用于自定义其行为的选项。 例如,可以指定用于文本分析的语言,设置权重以设置某些字段的优先级,并配置不区分大小写的搜索。 下面是使用选项创建文本索引的示例:
1. 创建一个索引,以支持对支持英语的 title 和 content 字段进行搜索。 此外,为 title 字段分配更高的权重,以在搜索结果中优先考虑它。
db.products.createIndex(
{ title: "text", content: "text" },
{ default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false }
)
文本索引中的权重
创建文本索引时,可以为索引中的单个字段分配不同的权重。 这些权重表示搜索中每个字段的重要性或相关性。 在执行文本搜索查询时,MongoDB 根据搜索词计算每个文档的分数和所分配权重。 分数表示文档与搜索查询的相关性。
1. 创建一个索引,以支持对 title 和 content 字段进行搜索。 为“标题”字段分配权重 2,为“内容”字段分配权重 1。
db.products.createIndex(
{ title: "text", content: "text" },
{ weights: { title: 2, content: 1 } }
)
备注:
当客户端使用“Mongo DB”一词执行文本搜索查询时,将根据该词在“标题”和“内容”字段中是否存在和出现频率计算集合中每个文档的分数,由于“标题”字段的权重更高,因此向该字段分配的重要性更高。
使用文本索引执行文本搜索
创建文本索引后,可以在查询中使用“text”运算符执行文本搜索。 文本运算符采用搜索字符串,并将其与文本索引匹配以查找相关文档。
1. 对短语 Mongo DB 执行文本搜索。
db.products.find(
{ $text: { $search: "Mongo DB" } }
)
2.(可选)在查询中使用 $meta 投影运算符和 textScore 字段来查看权重
db.products.find(
{ $text: { $search: "Mongo DB" } },
{ score: { $meta: "textScore" } }
)
删除文本索引
若要在 MongoDB 中删除文本索引,可对集合使用 dropIndex() 方法,并为想要移除的文本索引指定索引键或名称。
1.通过显式指定键来删除文本索引。
db.products.dropIndex({ title: "text" })
2.(可选)通过指定自动生成的唯一名称来删除文本索引。
db.products.dropIndex("title_text")
文本索引限制
- 一个集合上只能定义一个文本索引。
- 文本索引支持简单的文本搜索,不提供正则表达式搜索等高级搜索功能。
- 不支持将 Hint() 与采用 $text 表达式的查询一起使用。
- 排序操作无法使用 MongoDB 中文本索引的顺序。
- 与其他索引类型相比,文本索引可能相对较大,会占用大量存储空间。