MongoDB索引 —— 全文索引(Text Indexes)

文本索引

  • 概述
  • 版本支持
  • 创建文本索引
  • 指定权重
  • 通配符文本索引
  • 大小写不敏感(Case Insensitivity)
  • 变音符不敏感(Diacritic Insensitivity)
  • 标记分隔符(Tokenization Delimiters)
  • 支持的语言和停用词
  • 稀疏属性(sparse Property)
  • 限制
    • 每个集合只能有一个文本索引
    • 文本搜索和提示
    • 文本索引和排序
    • 复合索引
    • 删除文本索引
    • 校对选项(Collation Option)
  • 存储要求和性能成本
  • 文本搜索支持
  • 参考资料

概述

MongoDB提供文本索引以支持对字符串内容的文本搜索查询。 文本索引可以包括其值为字符串或包含字符串元素数组的任何字段。

版本支持

文本索引版本 描述
Version 3 MongoDB引入了文本索引的第3版。 版本3是MongoDB 3.2及更高版本中创建的文本索引的默认版本。
Version 2 MongoDB 2.6引入了文本索引的第2版。 版本2是MongoDB 2.6和3.0系列中创建的文本索引的默认版本。
Version 1 MongoDB 2.4引入了文本索引的第1版。 MongoDB 2.4只能支持版本1。

要覆盖默认版本并指定其他版本,请在创建索引时包含选项 {“textIndexVersion”:}

创建文本索引

注意:一个集合最多只能有一个文本索引。
要创建文本索引,请使用db.collection.createIndex() 方法,如下例所示:

db.reviews.createIndex( { comments: "text" } )

你也可以为多个字段创建文本索引。 以下示例在字段subject和comments上创建文本索引:

db.reviews.createIndex(
   {
     subject: "text",
     comments: "text"
   }
 )

复合索引可以包括文本索引键以及升序/降序索引键。 有关更多信息,请参阅复合索引。

要删除文本索引,请使用索引名称。 有关详细信息,请参阅使用索引名称删除文本索引。

指定权重

对于文本索引,索引字段的权重表示字段相对于其他索引字段在文本搜索分数方面的重要性。

对于文档中的每个索引字段,MongoDB将匹配数乘以权重并将结果相加。 MongoDB然后使用该结果计算文档的分数。 有关文本返回分数和排序的详细信息,请参阅$meta运算符。

索引字段的默认权重为1。 要调整索引字段的权重,请在db.collection.createIndex()方法中包含weights选项。

有关使用权重控制文本搜索结果的更多信息,请参阅使用权重控制搜索结果。

通配符文本索引

在多个字段上创建文本索引时,还可以使用通配符说明符 $**。 使用通配符文本索引,MongoDB会为包含集合中每个文档的字符串数据的每个字段编制索引。 以下示例使用通配符说明符创建文本索引:

db.collection.createIndex( { "$**": "text" } )

此索引允许在包含字符串内容的所有字段上进行文本搜索。 如果不清楚要包含在文本索引中的哪些字段或用于临时查询,则此类索引对于高度非结构化数据可能很有用。

通配符文本索引是多个字段上的文本索引。 因此,您可以在创建索引期间为特定字段指定权重,以控制结果的排名。 有关使用权重控制文本搜索结果的更多信息,请参阅使用权重控制搜索结果。

与所有文本索引一样,通配符文本索引可以是复合索引的一部分。 例如,以下内容在字段a和通配符说明符上创建复合索引:

db.collection.createIndex( { a: 1, "$**": "text" } )

与所有复合文本索引一样,由于a位于文本索引键之前,因此为了使用此索引执行 $text 搜索,查询谓词必须包含a的相等匹配条件。 有关复合文本索引的信息,请参阅复合文本索引。

大小写不敏感(Case Insensitivity)

[TO-DO]

变音符不敏感(Diacritic Insensitivity)

[TO-DO]

标记分隔符(Tokenization Delimiters)

在3.2版中更改

对于标记化,版本3文本索引使用在Unicode 8.0字符数据库支持列表中的Dash,Hyphen,Pattern_Syntax,Quotation_Mark,Terminal_Punctuation和White_Space下分类的分隔符。

例如,如果给出一个字符串“Il a dit qu’il«étaitlemeilleur joueur du monde»”,则文本索引将«,»和空格视为分隔符。

该指数的早期版本将 « 作为术语“«était”的一部分和»作为术语“monde”的一部分。

支持的语言和停用词

MongoDB支持各种语言的文本搜索。 文本索引删除特定于语言的停用词(例如英语,the,an,a等),并使用简单的语言特定后缀词干。 有关支持的语言的列表,请参阅文本搜索语言。

如果指定语言值为“none”,则文本索引使用简单的标记化,没有停用词列表且没有词干。

要指定文本索引的语言,请参阅指定文本索引的语言。

稀疏属性(sparse Property)

文本索引总是稀疏的,并忽略稀疏选项。 如果文档缺少文本索引字段(或者字段为null或空数组),则MongoDB不会将文档条目添加到文本索引中。 对于插入,MongoDB插入文档但不添加到文本索引。

对于包含文本索引键和其他类型键的复合索引,只有文本索引字段确定索引是否引用文档。 其他键不确定索引是否引用文档。

限制

每个集合只能有一个文本索引

一个集合最多可以有一个文本索引。

文本搜索和提示

如果查询包含 $text 查询表达式,则不能使用hint()。

文本索引和排序

排序操作无法从文本索引获取排序顺序,即使是复合文本索引也是如此; 即排序操作不能使用文本索引中的排序。

复合索引

复合索引可以包括文本索引键与升序/降序索引键的组合。 但是,这些复合索引具有以下限制:

  • 复合文本索引不能包含任何其他特殊索引类型,例如多键或地理空间索引字段。
  • 如果复合文本索引包括文本索引键之前的键,则执行 $text 搜索时,查询谓词必须包含前面键上的相等匹配条件。
  • 创建复合文本索引时,必须在索引规范文档中相邻地列出所有文本索引键。

另请参阅文本索引和排序以了解其他限制。

有关复合文本索引的示例,请参阅限制扫描的条目数。

删除文本索引

删除文本索引,将索引的名称传递给db.collection.dropIndex() 方法。 要获取索引的名称,请运行db.collection.getIndexes() 方法。

有关文本索引的默认命名方案以及覆盖默认名称的信息,请参阅指定文本索引的名称。

校对选项(Collation Option)

文本索引仅支持简单的二进制比较,不支持排序规则。

要在具有非简单排序规则的集合上创建文本索引,必须在创建索引时显式指定{collation:{locale:“simple”}}。

存储要求和性能成本

文本索引具有以下存储要求和性能成本:

  • 文本索引可能很大。 它们为插入的每个文档的每个索引字段中的每个唯一的后梗词包含一个索引条目。
  • 构建文本索引与构建大型多键索引非常相似,并且比在相同数据上构建简单的有序(标量)索引需要更长的时间。
  • 在现有集合上构建大型文本索引时,请确保对打开的文件描述符具有足够高的限制。 请参阅建议的设置。
  • 文本索引将影响插入吞吐量,因为MongoDB必须为每个新源文档的每个索引字段中的每个唯一后梗词添加索引条目。
  • 另外,文本索引不存储关于文档中单词的接近度的短语或信息。 因此,当整个集合适合RAM时,短语查询将更有效地运行。

文本搜索支持

文本索引支持$text查询操作。 有关文本搜索的示例,请参阅$text参考页面。 有关聚合管道中$text操作的示例,请参阅聚合管道中的文本搜索。

参考资料

Text Indexes

你可能感兴趣的:(MongoDB,MongoDB学习随笔)