在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