在 Azure Cosmos DB for MongoDB vCore 中使用文本索引进行搜索和查询
适用对象: MongoDB vCore
Azure Cosmos DB for MongoDB vCore 提供的其中一项主要功能是文本索引,通过它可高效地搜索和查询基于文本的数据。 该服务实现了版本 2 文本索引。 版本 2 支持区分大小写,但不支持区分音调符号。
Azure Cosmos DB for MongoDB 中的文本索引是一种特殊的数据结构,可优化基于文本的查询,使其更快、更高效。 它们旨在处理文本内容,例如文档、文章、注释或任何其他含有大量文本的数据。 文本索引使用词汇切分、词干提取和停用词等技术来创建索引,以提升基于文本的搜索性能。
先决条件
- 现有的 Azure Cosmos DB for MongoDB vCore 群集。
- 如果你没有 Azure 订阅,请创建一个帐户。
- 如果有现有 Azure 订阅,请创建新的 Azure Cosmos DB for MongoDB vCore 群集。
定义文本索引
为简单起见,让我们考虑一个使用以下设置的博客应用程序示例:
- 数据库名称:
cosmicworks
- 集合名称:
products
此示例应用程序将文章存储为具有以下结构的文档:
{
"_id": ObjectId("617a34e7a867530bff1b2346"),
"title": "Azure Cosmos DB - A Game Changer",
"content": "Azure Cosmos DB 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 Cosmos DB for MongoDB vCore,可以在多个字段上创建文本索引,从而能够跨文档中的不同字段执行文本搜索。
(可选)创建一个索引,以支持对
title
和content
字段进行搜索。db.products.createIndex({ title: "text", content: "text" })
配置文本索引选项
Azure Cosmos DB for MongoDB 中的文本索引附带多个用于自定义其行为的选项。 例如,可以指定用于文本分析的语言,设置权重以设置某些字段的优先级,并配置不区分大小写的搜索。 下面是使用选项创建文本索引的示例:
创建一个索引,以支持对支持英语的
title
和content
字段进行搜索。 此外,为title
字段分配更高的权重,以在搜索结果中优先考虑它。db.products.createIndex( { title: "text", content: "text" }, { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false } )
文本索引中的权重
创建文本索引时,可以为索引中的单个字段分配不同的权重。 这些权重表示搜索中每个字段的重要性或相关性。 在执行文本搜索查询时,Azure Cosmos DB for MongoDB vCore 根据搜索词计算每个文档的分数和所分配权重。 分数表示文档与搜索查询的相关性。
创建一个索引,以支持对
title
和content
字段进行搜索。 为“标题”字段分配权重 2,为“内容”字段分配权重 1。db.products.createIndex( { title: "text", content: "text" }, { weights: { title: 2, content: 1 } } )
注意
当客户端使用“Cosmos DB”一词执行文本搜索查询时,将根据该词在“标题”和“内容”字段中是否存在和出现频率计算集合中每个文档的分数,由于“标题”字段的权重更高,因此向该字段分配的重要性更高。
使用文本索引执行文本搜索
创建文本索引后,可以在查询中使用“text”运算符执行文本搜索。 文本运算符采用搜索字符串,并将其与文本索引匹配以查找相关文档。
对短语
Cosmos DB
执行文本搜索。db.products.find( { $text: { $search: "Cosmos DB" } } )
(可选)在查询中使用
$meta
投影运算符和textScore
字段来查看权重db.products.find( { $text: { $search: "Cosmos DB" } }, { score: { $meta: "textScore" } } )
删除文本索引
若要在 MongoDB 中删除文本索引,可对集合使用 dropIndex()
方法,并为想要移除的文本索引指定索引键或名称。
通过显式指定键来删除文本索引。
db.products.dropIndex({ title: "text" })
(可选)通过指定自动生成的唯一名称来删除文本索引。
db.products.dropIndex("title_text")
文本索引限制
- 一个集合上只能定义一个文本索引。
- 文本索引支持简单的文本搜索,不提供正则表达式搜索等高级搜索功能。
- 不支持将 Hint() 与采用 $text 表达式的查询一起使用。
- 排序操作无法使用 MongoDB 中文本索引的顺序。
- 与其他索引类型相比,文本索引可能相对较大,会占用大量存储空间。