Docs 菜单
Docs 主页
/
MongoDB Manual
/

自管理部署上的文本索引

在此页面上

  • 概述
  • 兼容性
  • 版本
  • 创建文本索引
  • 不区分大小写。
  • 不区分变音符号
  • 分词分隔符
  • 索引项
  • 支持的语言和停用词
  • sparse 属性
  • 限制
  • 文本搜索和短语
  • 存储要求和性能成本
  • 文本搜索支持

注意

本页介绍了自托管(非 Atlas)部署的文本查询功能。对于托管在 MongoDB Atlas 上的数据,MongoDB 提供了一种改进的全文查询解决方案, Atlas Search。

要在自管理部署上运行文本Atlas Search查询,您的集合必须有文本索引。 MongoDB提供文本索引来支持对Atlas Search string内容进行文本 查询。文本索引可以包括值为string或string元素数组的任何字段。 一个集合只能有一个文本Atlas Search索引,但该索引可以涵盖多个字段。

您可以对MongoDB Atlas 中托管的部署使用文本索引。

要了解有关为 MongoDB Atlas 中托管的部署管理索引的更多信息,请参阅创建、查看、删除和隐藏索引

文本索引提供三个版本。 默认情况下,MongoDB 使用带有新文本索引的版本 3。

要覆盖默认值并使用旧版本,请在创建索引时使用 textIndexVersion选项。

重要

一个collection最多可以有一个text索引。

Atlas Search(在 MongoDB Atlas 中可用)支持在单个集合上使用多个全文搜索索引。要了解更多信息,请参阅 Atlas Search 文档

要创建text索引,请使用 db.collection.createIndex()方法。要对包含字符串或字符串元素数组的字段进行索引,请包含该字段并在索引文档中指定字符串字面量"text" ,如下例所示:

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

您可以为text索引的多个字段编制索引。 以下示例在字段subjectcomments上创建text索引:

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

复合索引可以包括text索引键与升序/降序索引键的组合。 有关更多信息,请参阅复合索引。

要删除text索引,请使用索引名称。 有关更多信息,请参阅使用索引名称删除text索引

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

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

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

有关使用权重控制文本搜索结果的更多信息,请参阅为自托管部署上的文本搜索结果分配权重。

注意

通配符文本索引不同于通配符索引。 通配符索引不支持使用$text操作符的查询。

虽然通配符文本索引和通配符索引共享通配符$**字段模式,但它们是不同的索引类型。 只有通配符文本索引支持$text操作符。

在多个字段上创建text索引时,您还可以使用通配符说明符 ( $** )。 通过通配符文本索引,MongoDB 可以对collection中每个文档的每个包含字符串数据的字段进行索引。以下示例使用通配符说明符创建文本索引:

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

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

通配符文本索引是针对多个字段的text索引。因此,您可以在创建索引时为特定字段分配权重,以控制结果的排名。有关使用权重控制文本搜索结果的更多信息,请参阅为自托管部署上的文本搜索结果分配权重。

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

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

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

版本的3text 索引支持常见的C S和简单的 ,对于土耳其语,还支持特殊的T 大小写折叠,如 Unicode8.0 字符数据库大小写折叠 中指定。 。

大小写折叠扩展了text索引不区分大小写的功能,以包含带变音符号的字符,例如éÉ以及非拉丁字母表中的字符,例如西里尔字母中的 "И" 和 "i" 。

text索引的3版本也不区分变音符号。 因此,该索引也不区分éÉeE

以前版本的text索引不区分大小写,仅适用于[A-z] ;即,仅对非变音符号拉丁字符不区分大小写。 对于所有其他字符,早期版本的文本索引将它们视为不同字符。

在3版本中, text索引不区分变音符号。 也就是说,索引不区分包含变音标记的字符及其未标记的对应字符,例如éêe 。 更具体地说,text 索引会去掉 Unicode8 中归类为变音符号的字符。0 字符数据库属性列表

text索引的3版本对带变音符号的字符也不区分大小写。 因此,该索引也不区分éÉeE

以前版本的text索引将带有变音符号的字符视为不同字符。

对于分词, 版本的3text 索引使用 Unicode 中分类为DashHyphenPattern_SyntaxQuotation_MarkTerminal_PunctuationWhite_Space 8的分隔符。0 字符数据库属性列表

例如,如果给定字符串"Il a dit qu'il «était le meilleur joueur du monde»" ,则text索引会将«»和空格视为分隔符。

该索引的先前版本将«视为术语"«était"的一部分,并将»视为术语"monde»"的一部分。

text 索引对索引项的索引字段中的词语进行分词和词干处理。 text索引为集合中每个文档的每个索引字段中的每个唯一的词干存储一个索引项。 该索引使用简单的特定于语言的后缀词干。

MongoDB 支持各种语言的文本搜索。 text索引会删除特定于语言的停用词(例如英语中的theanaand等),并使用简单的特定于语言的后缀词干。有关支持的语言列表,请参阅自管理部署上的文本搜索语言。

如果您指定default_language值为none ,则文本索引会解析字段中的每个单词,包括停用词,并忽略后缀词干。

要为text索引指定语言,请参阅为自托管部署上的文本索引指定默认语言。

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

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

一个collection最多可以有一个text索引。

Atlas Search(在 MongoDB Atlas 中可用)支持在单个集合上使用多个全文搜索索引。要了解更多信息,请参阅 Atlas Search 文档

如果查询包含 $text 表达式,则不能使用 hint() 指定用于查询的索引。

如果$text操作的$search字符串包含短语和单个术语,则$text仅匹配包含该短语的文档。

不能将$text操作符与多个短语一起使用。

排序操作无法从text索引获取排序顺序,甚至无法从复合文本索引获取排序顺序;即排序操作不能使用文本索引中的顺序。

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

  • 复合text索引不能包含任何其他特殊索引类型,例如多键地理空间索引字段。

  • 如果复合文本索引包含文本索引键之前的键,要使用$text ,查询谓词必须包含前面键的等值匹配条件

  • 创建复合text索引时,所有text索引键必须在索引规范文档中相邻列出。

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

有关复合文本索引的示例,请参阅限制在自管理部署上扫描的文本索引项的数量。

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

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

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

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

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

  • text 索引可能很大。 对于插入的每个文档,每个字段中的每个唯一的帖子词干后单词都包含一个索引项。

  • 构建text索引与构建大型多键索引非常相似,并且比对相同数据构建简单的有序(标量)索引需要更长的时间。

  • 在现有collection上构建大型text索引时,请确保对打开文件描述符有足够高的限制。请参阅推荐设置。

  • text 索引会影响插入吞吐量,因为 MongoDB 必须为每个新源文档的每个索引字段中的每个唯一的词干后单词添加一个索引项。

  • 此外, text索引不存储短语或有关文档中单词相似度的信息。 因此,当整个collection都容纳在 RAM 中时,查询的运行效率会更高。

text索引支持$text查询操作。有关文本搜索的示例,请参阅$text reference page 。有关聚合管道中$text操作的示例,请参阅自托管部署上的聚合管道中的 $text。

后退

多键索引边界

来年

为自管理部署上的文本索引指定默认语言