Azure DocumentDB 提供的主要功能之一是文本索引,这样可以高效搜索和查询基于文本的数据。 该服务实现 版本 2 文本索引。 版本 2 支持区分大小写,但不支持音调敏感度。
Azure DocumentDB 中的文本索引是优化基于文本的查询的特殊数据结构,使它们更快、更高效。 它们旨在处理文本内容,如文档、文章、批注或任何其他文本密集型数据。 文本索引使用标记化、词干化和停止字词等技术来创建可提高基于文本的搜索性能的索引。
先决条件
Azure 订阅服务
- 如果没有 Azure 订阅,请创建 试用版
现有的 Azure DocumentDB 群集
- 如果没有群集,请 创建新群集
定义文本索引
为简单起见,让我们考虑一个具有以下设置的博客应用程序示例:
-
数据库名称:
cosmicworks -
集合名称:
products
此示例应用程序将文章存储为具有以下结构的文档:
{
"_id": ObjectId("617a34e7a867530bff1b2346"),
"title": "Azure DocumentDB - A Game Changer",
"content": "Azure DocumentDB is a globally distributed, multi-model database service.",
"author": "John Doe",
"category": "Technology",
"published": true
}
使用
createIndex方法和text选项在title字段上创建文本索引。use cosmicworks; db.products.createIndex({ title: "text" })注释
虽然每个集合只能定义一个文本索引,但 Azure DocumentDB 允许在多个字段上创建文本索引,以便跨文档中的不同字段执行文本搜索。
(可选)创建索引以支持对
title字段和content字段的搜索。db.products.createIndex({ title: "text", content: "text" })
配置文本索引选项
Azure DocumentDB 中的文本索引附带多个选项来自定义其行为。 例如,可以指定文本分析的语言、设置权重以确定某些字段的优先级,以及配置不区分大小写的搜索。 下面是使用选项创建文本索引的示例:
创建支持英语语言搜索的索引,用于
title和content字段的搜索。 此外,为title字段分配更高的权重,以在搜索结果中确定其优先级。db.products.createIndex( { title: "text", content: "text" }, { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false } )
文本索引中的权重
创建文本索引时,可以为索引中的单个字段分配不同的权重。 这些权重表示搜索中每个字段的重要性或相关性。 Azure DocumentDB 根据执行文本搜索查询时搜索词计算每个文档的分数和分配权重。 分数表示文档与搜索查询的相关性。
创建索引以支持对
title字段和content字段的搜索。 将权重 2 分配给“title”字段,并将权重 1 分配给“content”字段。db.products.createIndex( { title: "text", content: "text" }, { weights: { title: 2, content: 1 } } )注释
当客户端使用术语“DocumentDB”执行文本搜索查询时,集合中每个文档的分数将基于“title”和“content”字段中字词的状态和频率进行计算,因为“title”字段的权重较高。
使用文本索引执行文本搜索
创建文本索引后,可以在查询中使用“text”运算符执行文本搜索。 文本运算符采用搜索字符串,并将其与文本索引匹配以查找相关文档。
对短语
DocumentDB执行文本搜索。db.products.find( { $text: { $search: "DocumentDB" } } )可选地,将
$meta投影运算符与查询中的textScore字段一起使用,以查看权重db.products.find( { $text: { $search: "DocumentDB" } }, { score: { $meta: "textScore" } } )
删除文本索引
若要在 MongoDB 中删除文本索引,可以在 dropIndex() 集合上使用该方法,并为要删除的文本索引指定索引键或名称。
通过显式指定键来删除文本索引。
db.products.dropIndex({ title: "text" })(可选)通过指定自动生成的唯一名称来删除文本索引。
db.products.dropIndex("title_text")
文本索引限制
- 一个集合上只能定义一个文本索引。
- Hint() 函数不支持与使用 $text 表达式的查询结合使用。
- 排序作不能在 MongoDB 中使用文本索引的顺序。
- 与其他索引类型相比,文本索引可能相对较大,占用大量存储空间。