如何在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 中创建多语言文本索引。