在MongoDB中创建具有不同字段权重的文本索引
在MongoDB中创建索引时,您可以选择对每个索引字段应用不同的权重。text
这些权重表示索引字段之间的相对重要性。权重较高的字段在搜索结果中的影响比权重较低的字段更大。
这为您提供了对搜索结果计算方式的一定程度的控制。
默认权重为 1,因此如果未指定字段的权重,则会为其分配权重 1。
例
假设我们有一个名为 的集合,它包含如下文档:posts
{ “_id” : 1, “title” : “The Web”, “body” : “Body text…”, “abstract” : “Abstract text…” }
我们可以为三个文本字段创建一个复合索引,并为每个字段应用不同的权重。text
示例如下:
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
创建复合索引时,我指定了 3 个字段。当我指定权重时,我只为其中两个字段指定了权重。text
结果是这两个字段将按指定进行加权,另一个字段 () 的默认权重为 1。title
当我们运行时,我们可以看到这一点:[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" : "title_text_body_text_abstract_text",
"weights" : {
"abstract" : 5,
"body" : 10,
"title" : 1
},
"default_language" : "english",
"language_override" : "language",
"textIndexVersion" : 3
}
]这意味着该字段的重要性将是字段的两倍,并且是字段的重要性的十倍。body``abstract``title
具有加权字段的通配符文本索引
您可以在创建通配符文本索引时应用权重。当您不知道文档中的文本字段是什么时,通配符文本索引会很方便。你可能知道_一些_,但不是全部。
在这种情况下,您可以创建通配符文本索引,并为您知道的那些字段分配权重。将为任何其他字段分配默认值 1。
假设我们有以下文档作为准则:
{ “_id” : 1, “title” : “Title text…”, “body” : “Body text…”, “abstract” : “Abstract text…”, “tags” : [ “tag1”, “tag2”, “tag3” ] }
它与上一个文档类似,只是它现在有一个包含数组的字段。但据我们所知,该集合中的未来文档可能还有其他字段 - 例如 、、 等。tags``categories``keywords``author_bio
但我们实际上并不知道,因此我们将创建一个通配符文本索引,该索引将使用字符串数据封装所有字段。我们将为一些已知字段创建权重。
例:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
在这种情况下,字段的权重为 ,字段的权重为 。这意味着该字段的影响是抽象字段的两倍,是所有其他文本字段的十倍(因为它们将被分配默认权重 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