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的相等匹配条件。 有关复合文本索引的信息,请参阅复合文本索引。
[TO-DO]
[TO-DO]
在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”,则文本索引使用简单的标记化,没有停用词列表且没有词干。
要指定文本索引的语言,请参阅指定文本索引的语言。
文本索引总是稀疏的,并忽略稀疏选项。 如果文档缺少文本索引字段(或者字段为null或空数组),则MongoDB不会将文档条目添加到文本索引中。 对于插入,MongoDB插入文档但不添加到文本索引。
对于包含文本索引键和其他类型键的复合索引,只有文本索引字段确定索引是否引用文档。 其他键不确定索引是否引用文档。
一个集合最多可以有一个文本索引。
如果查询包含 $text 查询表达式,则不能使用hint()。
排序操作无法从文本索引获取排序顺序,即使是复合文本索引也是如此; 即排序操作不能使用文本索引中的排序。
复合索引可以包括文本索引键与升序/降序索引键的组合。 但是,这些复合索引具有以下限制:
另请参阅文本索引和排序以了解其他限制。
有关复合文本索引的示例,请参阅限制扫描的条目数。
删除文本索引,将索引的名称传递给db.collection.dropIndex() 方法。 要获取索引的名称,请运行db.collection.getIndexes() 方法。
有关文本索引的默认命名方案以及覆盖默认名称的信息,请参阅指定文本索引的名称。
文本索引仅支持简单的二进制比较,不支持排序规则。
要在具有非简单排序规则的集合上创建文本索引,必须在创建索引时显式指定{collation:{locale:“simple”}}。
文本索引具有以下存储要求和性能成本:
文本索引支持$text查询操作。 有关文本搜索的示例,请参阅$text参考页面。 有关聚合管道中$text操作的示例,请参阅聚合管道中的文本搜索。
Text Indexes