自管理部署上的文本索引
注意
本页介绍自托管(非 Atlas)部署的文本查询功能。 对于MongoDB Atlas上托管的数据, MongoDB提供改进的全文查询解决方案Atlas Search和向量搜索解决方案Atlas Vector Search。
Overview
要在自管理部署上运行文本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
索引的多个字段编制索引。 以下示例在字段subject
和comments
上创建text
索引:
db.reviews.createIndex( { subject: "text", comments: "text" } )
复合索引可以包括text
索引键与升序/降序索引键的组合。 有关更多信息,请参阅复合索引。
要删除text
索引,请使用索引名称。 有关更多信息,请参阅使用索引名称删除text
索引。
指定权重
对于text
索引,索引字段的权重表示该字段在文本搜索分数方面相对于其他索引字段的重要性。
对于文档中的每个索引字段,MongoDB 会将匹配项数乘以权重,并对结果求和。 然后,MongoDB 使用此总和计算文档的分数。 有关返回文本分数和按文本分数排序的详细信息,请参阅$meta
操作符。
索引字段的默认权重为 1。要调整索引字段的权重,请在db.collection.createIndex()
方法中包含
weights
选项。
有关使用权重控制文本搜索结果的更多信息,请参阅为自托管部署上的文本搜索结果分配权重。
通配符文本索引
注意
在多个字段上创建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版本也不区分变音符号。 因此,该索引也不区分é
、 É
、 e
和E
。
以前版本的text
索引不区分大小写,仅适用于[A-z]
;即,仅对非变音符号拉丁字符不区分大小写。 对于所有其他字符,早期版本的文本索引将它们视为不同字符。
不区分变音符号
在3版本中, text
索引不区分变音符号。 也就是说,索引不区分包含变音标记的字符及其未标记的对应字符,例如é
、 ê
和e
。 更具体地说,text
索引会去掉 Unicode8 中归类为变音符号的字符。0 字符数据库属性列表 。
text
索引的3版本对带变音符号的字符也不区分大小写。 因此,该索引也不区分é
、 É
、 e
和E
。
以前版本的text
索引将带有变音符号的字符视为不同字符。
分词分隔符
对于分词, 版本的3text
索引使用 Unicode 中分类为Dash
、Hyphen
、Pattern_Syntax
、Quotation_Mark
、Terminal_Punctuation
和White_Space
8的分隔符。0 字符数据库属性列表 。
例如,如果给定字符串"Il a dit qu'il «était le meilleur
joueur du monde»"
,则text
索引会将«
、 »
和空格视为分隔符。
该索引的先前版本将«
视为术语"«était"
的一部分,并将»
视为术语"monde»"
的一部分。
索引项
text
索引对索引项的索引字段中的术语进行分词和词干处理。 text
索引为集合中每个文档的每个索引字段中的每个唯一的词干存储一个索引项。 该索引使用简单的特定于语言的后缀词干。
支持的语言和停用词
MongoDB支持各种语言的文本搜索。 text
索引会删除特定于语言的停用词(例如英语中的the
、 an
、 a
、 and
等),并使用简单的特定于语言的后缀词干。 有关支持的语言列表,请参阅自管理部署上的文本搜索语言。
如果将 default_language
值指定为 none
,文本索引会解析字段中的每个词,包括停用词,并忽略后缀词干。
要为text
索引指定语言,请参阅为自管理部署上的文本索引指定默认语言。
sparse
属性
text
索引始终为稀疏索引,并忽略稀疏选项。 如果文档缺少text
索引字段(或者该字段为null
或空数组),则 MongoDB 不会将该文档的条目添加到text
索引。 对于插入,MongoDB 会插入文档,但不会添加到text
索引。
对于包含text
索引键和其他类型键的复合索引,只有text
索引字段决定索引是否引用文档。 其他键并不能确定索引是否引用了文档。
限制
每个collection一个文本索引
一个collection最多可以有一个text
索引。
Atlas Search(在 MongoDB Atlas 中可用)支持在单个集合上使用多个全文搜索索引。要了解更多信息,请参阅 Atlas Search 文档。
文本搜索和提示
如果查询包含 $text
表达式,则不能使用 hint()
指定用于查询的索引。
文本搜索和短语
如果 $text
操作的 $search
字符串包含短语和单个词,$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。