在MongoDB中创建通配符文本索引
MongoDB为我们提供了创建通配符文本索引的能力。
通配符文本索引类似于通配符索引,不同之处在于通配符文本索引支持运算符,而通配符索引不支持运算符。$text
也就是说,创建每种索引类型非常相似,因为它们都共享通配符字段模式。$**
例
假设我们有一个名为 的集合,它包含如下所示的文档:posts
{ “_id” : 1, “title” : “Title text…”, “body” : “Body text…”, “abstract” : “Abstract text…”, “tags” : [ “tag1”, “tag2”, “tag3” ] }
我们可以在该集合上创建一个通配符文本索引,如下所示:
db.posts.createIndex( { "$**": "text" } )
输出:
{ “createdCollectionAutomatically” : false, “numIndexesBefore” : 1, “numIndexesAfter” : 2, “ok” : 1 }
它使用通配符字段模式在所有文本字段上创建索引。当您创建这样的索引时,MongoDB会索引包含集合中每个文档的字符串数据的每个字段。$**
如果集合包含大量非结构化内容,并且文档中的文本字段不一致,则执行此操作可能很有用。在这种情况下,您将无法在索引中显式包含字段,因为您不知道文档中将包含哪些字段。
加权字段
您可以使用该参数为通配符文本索引中的字段分配不同的权重。weights
例:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
输出:
{ “createdCollectionAutomatically” : false, “numIndexesBefore” : 1, “numIndexesAfter” : 2, “ok” : 1 }
在这种情况下,字段的权重为 ,字段的权重为 。这意味着该字段的影响是抽象字段的两倍,是所有其他文本字段的十倍(因为它们将被分配默认权重 1)。body``10``abstract``5``body
创建该索引后,如果我们调用返回集合的所有索引,我们可以看到赋予字段的权重:getIndexes()
db.posts.getIndexes()
输出:
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"name" : "$**_text",
"weights" : {
"$**" : 1,
"abstract" : 5,
"body" : 10
},
"default_language" : "english",
"language_override" : "language",
"textIndexVersion" : 3
}
]正如预期的那样,字段得到,字段得到,所有其他得到。body``10``abstract``5``1