如何在MongoDB中创建文本索引
您可以在MongoDB中创建各种类型的索引。如果字段包含字符串或字符串数组,则可以对该字段使用索引。text
若要创建索引,请在创建索引时使用字符串文本作为值。text``"text"
在单个字段上创建文本索引
假设我们有一个名为 的集合,它包含如下文档:posts
{ “_id” : 1, “title” : “The Web”, “body” : “Body text…”, “abstract” : “Abstract text…” }
我们可能希望在字段或字段上创建索引,甚至两者兼而有之。text``body``abstract
下面介绍如何在字段上创建索引:text``body
db.posts.createIndex( { body : "text" } )
输出:
{ “createdCollectionAutomatically” : false, “numIndexesBefore” : 1, “numIndexesAfter” : 2, “ok” : 1 }
现在,我们可以使用该方法来查看索引:[getIndexes()](https://database.guide/get-a-list-of-indexes-in-mongodb/ "Get a List of Indexes in MongoDB")
db.posts.getIndexes()
结果:
[ { “v” : 2, “key” : { “_id” : 1 }, “name” : “id” }, { “v” : 2, “key” : { “_fts” : “text”, “_ftsx” : 1 }, “name” : “body_text”, “weights” : { “body” : 1 }, “default_language” : “english”, “language_override” : “language”, “textIndexVersion” : 3 } ]
我们可以看到有两个索引。第一个是使用集合自动创建的默认索引。第二个索引是我们刚刚创建的索引。_id
MongoDB自动为我们新创建的索引分配了一个名称。它被称为.body_text
创建复合文本索引
一个集合只能有一个索引,但如果需要,它可以是复合索引。text
让我们创建一个包含字段和字段的复合索引。body``abstract
如前所述,一个集合只能有一个索引,所以让我们删除我们刚刚创建的索引:text
db.posts.dropIndex("body_text")
输出:
{ “nIndexesWas” : 2, “ok” : 1 }
好的,现在我们已经删除了索引,让我们继续创建另一个索引 - 这次它将是一个复合索引:text
db.posts.createIndex( {
body : "text",
abstract : "text"
} )
输出:
{ “createdCollectionAutomatically” : false, “numIndexesBefore” : 1, “numIndexesAfter” : 2, “ok” : 1 }
这是一条确认消息,告诉我们曾经有 1 个索引,但现在有 2 个。
让我们再次检查索引列表:
db.posts.getIndexes()
结果:
[ { “v” : 2, “key” : { “_id” : 1 }, “name” : “id” }, { “v” : 2, “key” : { “_fts” : “text”, “_ftsx” : 1 }, “name” : “body_text_abstract_text”, “weights” : { “abstract” : 1, “body” : 1 }, “default_language” : “english”, “language_override” : “language”, “textIndexVersion” : 3 } ]
请注意,复合索引具有以下限制:text
- 复合索引不能包含任何其他特殊索引类型,例如多键或地理空间索引字段。
text - 如果复合索引在索引键之前包含键,则若要执行搜索,查询谓词必须包括前面键的相等匹配条件。
text``text``$text - 创建复合索引时,必须在索引规范文档中相邻列出所有索引键。
text``text
创建通配符文本索引
您可以使用通配符字段模式创建通配符文本索引。$**
让我们删除上一个索引并创建一个通配符文本索引:
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )
MongoDB还为我们提供了创建通配符索引的能力,但是通配符文本索引和通配符索引是两个不同的东西。
特别是,通配符文本索引支持运算符,而通配符索引不支持。$text
参数weights
创建索引时,可以选择在一个或多个字段上指定权重。默认情况下,每个字段的权重为 1。但是您可以更改此设置,以便为字段在搜索结果中提供更多或更少的权重。text
例
db.posts.dropIndex("$**_text")
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
我从删除以前的索引开始。
创建新索引时,我指定了 3 个字段。当我指定权重时,我只为其中两个字段指定了权重。text
结果是这两个字段将按指定进行加权,另一个字段 () 的默认权重为 1。title
当我们再次运行时,我们可以看到这一点:getIndexes()
db.posts.getIndexes()
结果:
[ { “v” : 2, “key” : { “_id” : 1 }, “name” : “id” }, { “v” : 2, “key” : { “_fts” : “text”, “_ftsx” : 1 }, “name” : “title_text_body_text_abstract_text”, “weights” : { “abstract” : 5, “body” : 10, “title” : 1 }, “default_language” : “english”, “language_override” : “language”, “textIndexVersion” : 3 } ]
这意味着该字段的重要性将是字段的两倍,并且是字段的重要性的十倍。body``abstract``title
创建多语言文本索引
您会注意到上述索引包含 和 在其定义中。text``"default_language" : "english"``"language_override" : "language"
这些字段有助于处理多种语言的文档。上述索引中的值是默认值。
创建文档时,可以使用字段(或在索引字段中定义的某个其他字段)指定该文档的语言。如果文档中不存在此类字段,则它将使用该字段中指定的默认语言。language``language_override``text``default_language
您可以在创建索引时指定 (和 )。default_language``language_override
有关创建支持多种语言的文本索引的示例,请参阅在 MongoDB 中创建多语言文本索引。