在 Azure Cosmos DB for MongoDB vCore 中使用文本索引进行搜索和查询

适用对象: MongoDB vCore

Azure Cosmos DB for MongoDB vCore 提供的其中一项主要功能是文本索引,通过它可高效地搜索和查询基于文本的数据。 该服务实现了版本 2 文本索引。 版本 2 支持区分大小写,但不支持区分音调符号。

Azure Cosmos DB for MongoDB 中的文本索引是一种特殊的数据结构,可优化基于文本的查询,使其更快、更高效。 它们旨在处理文本内容,例如文档、文章、注释或任何其他含有大量文本的数据。 文本索引使用词汇切分、词干提取和停用词等技术来创建索引,以提升基于文本的搜索性能。

先决条件

定义文本索引

为简单起见,让我们考虑一个使用以下设置的博客应用程序示例:

  • 数据库名称: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
}
  1. 使用 createIndex 方法与 text 选项,在 title 字段上创建文本索引。

    use cosmicworks;
    
    db.products.createIndex({ title: "text" })
    

    注意

    虽然每个集合只能定义一个文本索引,但通过 Azure Cosmos DB for MongoDB vCore,可以在多个字段上创建文本索引,从而能够跨文档中的不同字段执行文本搜索。

  2. (可选)创建一个索引,以支持对 titlecontent 字段进行搜索。

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

配置文本索引选项

Azure Cosmos DB for MongoDB 中的文本索引附带多个用于自定义其行为的选项。 例如,可以指定用于文本分析的语言,设置权重以设置某些字段的优先级,并配置不区分大小写的搜索。 下面是使用选项创建文本索引的示例:

  1. 创建一个索引,以支持对支持英语的 titlecontent 字段进行搜索。 此外,为 title 字段分配更高的权重,以在搜索结果中优先考虑它。

    db.products.createIndex(
        { title: "text", content: "text" },
        { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false }
    )
    

文本索引中的权重

创建文本索引时,可以为索引中的单个字段分配不同的权重。 这些权重表示搜索中每个字段的重要性或相关性。 在执行文本搜索查询时,Azure Cosmos DB for MongoDB vCore 根据搜索词计算每个文档的分数和所分配权重。 分数表示文档与搜索查询的相关性。

  1. 创建一个索引,以支持对 titlecontent 字段进行搜索。 为“标题”字段分配权重 2,为“内容”字段分配权重 1。

    db.products.createIndex(
    { title: "text", content: "text" },
    { weights: { title: 2, content: 1 } }
    )
    

    注意

    当客户端使用“Cosmos DB”一词执行文本搜索查询时,将根据该词在“标题”和“内容”字段中是否存在和出现频率计算集合中每个文档的分数,由于“标题”字段的权重更高,因此向该字段分配的重要性更高。

使用文本索引执行文本搜索

创建文本索引后,可以在查询中使用“text”运算符执行文本搜索。 文本运算符采用搜索字符串,并将其与文本索引匹配以查找相关文档。

  1. 对短语 Cosmos DB 执行文本搜索。

    db.products.find(
        { $text: { $search: "Cosmos DB" } }
    )
    
  2. (可选)在查询中使用 $meta 投影运算符和 textScore 字段来查看权重

    db.products.find(
        { $text: { $search: "Cosmos DB" } },
        { score: { $meta: "textScore" } }
    )
    

删除文本索引

若要在 MongoDB 中删除文本索引,可对集合使用 dropIndex() 方法,并为想要移除的文本索引指定索引键或名称。

  1. 通过显式指定键来删除文本索引。

    db.products.dropIndex({ title: "text" })
    
  2. (可选)通过指定自动生成的唯一名称来删除文本索引。

    db.products.dropIndex("title_text")
    

文本索引限制

  • 一个集合上只能定义一个文本索引。
  • 文本索引支持简单的文本搜索,不提供正则表达式搜索等高级搜索功能。
  • 不支持将 Hint() 与采用 $text 表达式的查询一起使用。
  • 排序操作无法使用 MongoDB 中文本索引的顺序。
  • 与其他索引类型相比,文本索引可能相对较大,会占用大量存储空间。

后续步骤