次の方法で共有

在 Azure DocumentDB 中使用文本索引进行搜索和查询

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
}
  1. 使用 createIndex 方法和 text 选项在 title 字段上创建文本索引。

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

    注释

    虽然每个集合只能定义一个文本索引,但 Azure DocumentDB 允许在多个字段上创建文本索引,以便跨文档中的不同字段执行文本搜索。

  2. (可选)创建索引以支持对title字段和content字段的搜索。

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

配置文本索引选项

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

  1. 创建支持英语语言搜索的索引,用于titlecontent字段的搜索。 此外,为 title 字段分配更高的权重,以在搜索结果中确定其优先级。

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

文本索引中的权重

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

  1. 创建索引以支持对title字段和content字段的搜索。 将权重 2 分配给“title”字段,并将权重 1 分配给“content”字段。

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

    注释

    当客户端使用术语“DocumentDB”执行文本搜索查询时,集合中每个文档的分数将基于“title”和“content”字段中字词的状态和频率进行计算,因为“title”字段的权重较高。

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

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

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

    db.products.find(
        { $text: { $search: "DocumentDB" } }
    )
    
  2. 可选地,将 $meta 投影运算符与查询中的 textScore 字段一起使用,以查看权重

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

删除文本索引

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

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

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

    db.products.dropIndex("title_text")
    

文本索引限制

  • 一个集合上只能定义一个文本索引。
  • Hint() 函数不支持与使用 $text 表达式的查询结合使用。
  • 排序作不能在 MongoDB 中使用文本索引的顺序。
  • 与其他索引类型相比,文本索引可能相对较大,占用大量存储空间。

后续步骤