On this page
Text Indexes
在本页面
Overview
MongoDB 提供text indexes以支持对字符串内容的文本搜索查询。 text索引可以包含任何值为字符串或字符串元素数组的字段。
Versions
text索引版本 |
Description |
|---|---|
| Version 3 | MongoDB 引入了text索引的版本 3.版本 3 是在 MongoDB 3.2 及更高版本中创建的text索引的默认版本。 |
| Version 2 | MongoDB 2.6 引入了text索引的版本 2.版本 2 是在 MongoDB 2.6 和 3.0 系列中创建的text索引的默认版本。 |
| Version 1 | MongoDB 2.4 引入了text索引的版本 1. MongoDB 2.4 仅支持版本1。 |
要覆盖默认版本并指定其他版本,请在创建索引时包括选项{ "textIndexVersion": <version> }。
创建文本索引
Important
一个集合最多可以具有一个** text索引。
若要创建text索引,请使用db.collection.createIndex()方法。要为包含字符串或字符串元素数组的字段构建索引,请包括该字段并在索引文档中指定字符串 Literals"text",如以下示例所示:
db.reviews.createIndex( { comments: "text" } )
您可以为text索引构建多个字段的索引。以下示例在字段subject和comments上创建text索引:
db.reviews.createIndex(
{
subject: "text",
comments: "text"
}
)
compound index可以包含text索引键以及升/降索引键。有关更多信息,请参见Compound Index。
为了删除text索引,请使用索引名称。有关更多信息,请参见使用索引名称删除文本索引。
Specify Weights
对于text索引,索引字段的* weight *表示就文本搜索得分而言,该字段相对于其他索引字段的重要性。
对于文档中的每个索引字段,MongoDB 将匹配数乘以权重并求和。然后,使用此总和,MongoDB 计算文档的分数。有关按文本分数返回和排序的详细信息,请参见$meta运算符。
索引字段的默认权重为 1.要调整索引字段的权重,请在db.collection.createIndex()方法中包括weights选项。
有关使用权重控制文本搜索结果的更多信息,请参见用权重控制搜索结果。
通配符文本索引
在多个字段上创建text索引时,还可以使用通配符说明符($**)。使用通配符文本索引,MongoDB 可以对包含集合中每个文档的字符串数据的每个字段构建索引。以下示例使用通配符指定符创建文本索引:
db.collection.createIndex( { "$**": "text" } )
该索引允许在具有字符串内容的所有字段上进行文本搜索。如果不清楚要在文本索引中包含哪些字段或用于临时查询,则此类索引对于高度非结构化的数据很有用。
通配符文本索引是多个字段上的text个索引。这样,您可以在创建索引期间将权重分配给特定字段,以控制结果的排名。有关使用权重控制文本搜索结果的更多信息,请参见用权重控制搜索结果。
与所有文本索引一样,通配符文本索引可以是复合索引的一部分。例如,以下代码在字段a以及通配符说明符上创建一个复合索引:
db.collection.createIndex( { a: 1, "$**": "text" } )
与所有复合 Literals 索引一样,由于a在文本索引键之前,因此要使用该索引执行$text搜索,查询谓词必须包含等式匹配条件a。有关复合文本索引的信息,请参见复合 Literals 索引。
Case Insensitivity
在版本 3.2 中更改。
版本 3 text索引支持常见的C,简单的S,对于土耳其语,则按Unicode 8.0 字符数据库案例折叠中指定的特殊T大小写折叠。
大小写折叠扩展了text索引的不区分大小写,以包括带有变音符号的字符,例如é和É,以及来自非拉丁字母的字符,例如西里尔字母的“И”和“и”。
text索引的版本 3 也是diacritic insensitive。因此,索引也无法区分é,É,e和E。
text索引的早期版本仅对[A-z]区分大小写;即仅对非变音符号的拉丁字符不区分大小写。对于所有其他字符,早期版本的文本索引将它们视为不同的字符。
Diacritic Insensitivity
在版本 3.2 中更改。
在版本 3 中,text索引不区分音素。也就是说,索引不会区分包含变音标记的字符和未标记的对应字符,例如é,ê和e。更具体地说,text索引剥离了Unicode 8.0 字符数据库属性列表中归类为变音符号的字符。
带有变音符号的字符的text索引的第 3 版也为case insensitive。因此,索引也无法区分é,É,e和E。
text索引的早期版本将带变音符号的字符视为不同的字符。
Tokenization Delimiters
在版本 3.2 中更改。
对于标记化,版本 3 text索引使用在Unicode 8.0 字符数据库属性列表中归类为Dash,Hyphen,Pattern_Syntax,Quotation_Mark,Terminal_Punctuation和White_Space的定界符。
例如,如果给定字符串"Il a dit qu'il «était le meilleur joueur du monde»",则text索引会将«,»和空格视为定界符。
索引的早期版本将«视为术语"«était"的一部分并将»视为术语"monde»"的一部分。
Index Entries
text index 标记并词干索引条目中索引字段中的术语。 text索引为集合中每个文档的每个索引字段中的每个唯一词干项存储一个索引条目。索引使用简单的language-specific后缀词干。
支持的语言和停用词
MongoDB 支持多种语言的文本搜索。 text索引会丢弃特定于语言的停用词(例如英语,the,an,a,and等),并使用简单的特定于语言的后缀词干。有关支持的语言的列表,请参见Literals 搜寻语言。
如果您将语言值指定为"none",则text索引将使用简单的分词化,没有停用词列表,也没有词干。
要为text索引指定语言,请参见指定文本索引的语言。
sparse Property
text索引始终为sparse,而忽略sparse选项。如果文档缺少text索引字段(或者该字段是null或空数组),则 MongoDB 不会将文档的条目添加到text索引中。对于插入,MongoDB 插入文档,但不添加到text索引。
对于包含text索引键以及其他类型的键的复合索引,只有text索引字段才能确定索引是否引用文档。其他键不能确定索引是否引用文档。
Restrictions
每个集合一个文本索引
一个集合最多可以具有一个** text索引。
Literals 搜索和提示
文本索引和排序
排序操作无法从text索引,甚至不能从复合 Literals 索引获得排序 Sequences;即排序操作不能使用文本索引中的 Sequences。
Compound Index
compound index可以包含text索引键以及升/降索引键。但是,这些复合索引具有以下限制:
复合
text索引不能包含任何其他特殊索引类型,例如multi-key或geospatial索引字段。如果化合物
text索引在text索引键之前包含键 ,要执行$text搜索,查询谓词必须在前面的键上包含 相等匹配条件**。创建复合
text索引时,所有text索引键必须在索引规范文档中相邻列出。
有关其他限制,另请参见Literals 索引和排序。
有关复合文本索引的示例,请参见限制扫描的条目数。
删除文本索引
要删除text索引,请将索引的* name *传递给db.collection.dropIndex()方法。若要获取索引的名称,请运行db.collection.getIndexes()方法。
有关text索引的默认命名方案以及覆盖默认名称的信息,请参见指定 Literals 索引的名称。
Collation Option
text索引仅支持简单的二进制比较,不支持collation。
要在具有非简单排序规则的集合上创建text索引,必须在创建索引时显式指定{collation: {locale: "simple"} }。
存储要求和性能成本
text索引具有以下存储要求和性能成本:
text索引可能很大。它们在每个插入的文档的每个索引字段中为每个唯一的词干词包含一个索引条目。构建
text索引与构建大型多键索引非常相似,并且比在相同数据上构建简单的有序(标量)索引要花更长的时间。在现有集合上构建较大的
text索引时,请确保对打开的文件 Descriptors 有足够高的限制。参见recommended settings。text索引将影响插入吞吐量,因为 MongoDB 必须在每个新源文档的每个索引字段中为每个唯一的词干词添加一个索引条目。此外,
text索引不存储短语或有关文档中单词接近程度的信息。结果,当整个集合放入 RAM 中时,短语查询将更有效地运行。
Literals 搜索支持
text索引支持$text查询操作。有关文本搜索的示例,请参见$ text 参考页。有关聚合管道中$text操作的示例,请参见聚合管道中的文本搜索。