本章内容:
MONGODB ATLAS搜索:
Atlas Search使在MongoDB数据之上轻松构建基于关联的快速搜索功能成为可能。立即在MongoDB Atlas(官方完全托管的数据库服务)上试用。
为了支持对字符串内容的文本搜索查询,MongoDB提供了文本索引。文本(text )索引可以包含任何值为字符串或字符串元素数组的字段。
文本索引版本 |
描述 |
---|---|
版本3 |
MongoDB引入了文本索引的版本3。版本3是在MongoDB 3.2及更高版本中创建的文本索引的默认版本。 |
版本2 |
MongoDB 2.6引入了文本索引的版本2。版本2是在MongoDB 2.6和3.0系列中创建的文本索引的默认版本。 |
版本1 |
MongoDB 2.4引入了文本索引的版本1。 MongoDB 2.4仅支持版本1。 |
要覆盖默认版本并指定其他版本,请在创建索引时包含选项:
{ "textIndexVersion":
重要:
一个集合最多有一个文本索引。
要创建文本索引,请使用db.collection.createIndex()方法。
要为包含字符串或字符串元素数组的字段建立索引,请包括该索引字段并指定字符串符号“text”,如以下示例所示:
db.reviews.createIndex( { comments: "text" } )
您可以为多个字段建立文本索引。以下示例在subject 和 comments字段上创建文本索引:
db.reviews.createIndex(
{
subject: "text",
comments: "text"
}
)
复合索引可以包括文本索引键以及升/降索引键。有关更多信息,请参见复合索引。
为了删除文本索引,请使用索引名称。有关更多信息,请参见使用索引名称删除文本索引。
对于文本索引,索引字段的权重表示就文本搜索分数而言,该字段相对于其他索引字段的重要性。
对于文档中的每个索引字段,MongoDB将匹配数乘以权重并求和。然后,使用此总和,MongoDB计算文档的分数。有关按文本分数返回和排序的详细信息,请参见$ meta运算符。
索引字段的默认权重为1。要调整索引字段的权重,请在 db.collection.createIndex()方法中包括weights选项。
有关使用权重控制文本搜索结果的更多信息,请参见使用权重控制搜索结果。
注意
通配符文本索引与通配符索引不同。通配符索引不支持使用$ text运算符进行查询。
尽管通配符文本索引和通配符索引共享通配符$**字段模式,但它们是不同的索引类型。仅通配符文本索引支持$ text运算符。
在多个字段上创建文本索引时,可以使用通配符说明符($ **)。使用通配符文本索引,MongoDB会为集合中的所有文档的每一个包含字符串数据的字段建立索引。下面的示例使用通配符创建文本索引:
db.collection.createIndex( { "$**": "text" } )
该索引允许在具有字符串内容的所有字段上进行文本搜索。如果不清楚哪些字段要创建文本索引或用于实时查询(Ad-Hoc Query),则此类索引对于高度非结构化的数据很有用。
通配符文本索引是多个字段上的文本索引。这样,可以在创建索引期间将权重分配给特定字段,以控制结果的排名。有关使用权重控制文本搜索结果的更多信息,请参见使用权重控制搜索结果。
与所有文本索引一样,通配符文本索引可以是复合索引的一部分。例如,以下代码在字段a和通配符说明符上创建一个复合索引:
db.collection.createIndex( { a: 1, "$**": "text" } )
与所有复合文本索引一样,由于a在文本索引键之前,因此要使用该索引执行$ text搜索,查询谓词必须包含等式匹配条件a。有关复合文本索引的信息,请参见复合文本索引。
在版本3.2中更改。
文本索引的版本3,支持通用的C,简单的S,以及对于土耳其语中T的大写转换(case foldings),均支持Unicode 8.0字符数据库大写转换。
大小写转换(case foldings)扩展了文本索引的大小写不敏感,包括带有变音符的字符(例如é和É)以及非拉丁字母的字符,例如西里尔字母的“И”和“и”。
关于大小写转换(case foldings),请参考如下链接:
https://www.w3.org/International/wiki/Case_folding
文本索引的版本3支持变音符不敏感。因此,索引对é,É,e和E无法分辨。
之前版本的文本索引仅对[A-z]的大小写不敏感;即仅对非变音符号的拉丁字符不区分大小写。对于所有其他字符,早期版本的文本索引将它们视为不同的字符。
在版本3.2中更改。
在版本3中,文本索引对变音符不敏感。也就是说,索引不会区分包含变音符的字符和不包含变音符字符,例如é,ê和e。更具体地说,文本索引会删除Unicode 8.0字符数据库属性列表中归为变音符的字符。
文本索引的版本3对带有变音符的字符也是大小写不敏感。因此,索引也无法区分é,É,e和E。
早期版本的文本索引将带有变音符号的字符视为不同的字符。
在版本3.2中更改。
对于分词(tokenization),版本3文本索引使用分隔符(delimiters),这些分隔符在
Unicode 8.0字符数据库属性列表中分类为Dash,Hyphen,Pattern_Syntax,Quotation_Mark,
Terminal_Punctuation和White_Space。
例如,对于字符串"Il a dit qu'il «était le meilleur joueur du monde»",则文本索引会将«,»和空格作为分隔符。
索引的先前版本将«视为术语”«était”的一部分,并将»视为术语”monde»”的一部分。
注释
tokenization (分词):就是把一篇文章拆分成一个个的单词(The process of breaking text apart is called tokenization )。
Delimiters (分隔符):要把一个句子 分割成一个个的单词,就需要分隔符,常用的分隔符有:空格、tab键(\t);还有 逗号、句号……这个要视具体的处理任务而定(The elements of the text that determine where elements should be split are called Delimiters)。
文本索引标记并阻止索引条目的索引字段中的术语。文本索引为集合中每个文档的每个索引字段中的每个唯一词干项存储一个索引条目。该索引使用特定于语言的简单后缀词干。
MongoDB支持多种语言的文本搜索。文本索引会丢弃特定于语言的停用词(例如英语中,the,an,a,and等),并使用简单的特定于语言的后缀词干。有关支持的语言的列表,请参见文本搜索语言。
如果您将语言(language)值设置为"none",则文本索引将使用简单的标记,没有停用词列表且没有词干。
要为文本索引指定语言,请参阅为文本索引指定语言。
文本索引始终是稀疏的,并且忽略稀疏选项。如果文档缺少文本索引字段(或者该字段为null或空数组),则MongoDB不会将文档条目添加到文本索引中。对于插入,MongoDB插入文档,但不添加到文本索引。
对于包含文本索引键以及其他类型的键的复合索引,只有文本索引字段才能确定索引是否引用文档。其他键不能确定索引是否引用文档。
一个集合最多可以有一个文本索引。
如果查询包含$ text查询表达式,则不能使用hint()。
排序操作无法从文本索引(甚至是复合文本索引)获得排序顺序;即排序操作不能使用文本索引中的顺序。
复合索引可以包含文本索引键和升/降索引键。但是,这些复合索引具有以下限制:
要了解其他更多限制,请参阅文本索引和排序。
有关复合文本索引的示例,请参见限制扫描的条目数。
要删除文本索引,需要把索引名称传递给db.collection.dropIndex()方法。
获取索引的名称,请使用db.collection.getIndexes()方法。
有关文本索引的默认命名方案以及覆盖默认名称的信息,请参见为文本索引指定名称。
文本索引仅支持简单的二进制比较,不支持比对规则。
注释
collation即比对方法:用于指定数据集如何排序,以及字符串的比对规则。
要在具有非简单归类的集合上创建文本索引,必须在创建索引时显式指定{collation: {locale: "simple"} }。
文本索引具有以下存储要求和性能成本:
文本索引支持$ text查询操作。有关文本搜索的示例,请查阅$ text参考。有关聚合管道中$ text操作的示例,请参阅聚合管道中的文本搜索。
上一篇:多键索引的边界处理(一)和 多键索引的边界处理(二)
参考原文:https://docs.mongodb.com/manual/core/index-text/#create-text-index