在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