$text

在本页面

Definition

在版本 3.2 中更改。

{
  $text:
    {
      $search: <string>,
      $language: <string>,
      $caseSensitive: <boolean>,
      $diacriticSensitive: <boolean>
    }
}

$text运算符接受具有以下字段的文本查询文档:

Field Type Description
$search string MongoDB 解析并用于查询文本索引的术语字符串。除非指定为短语,否则 MongoDB 会对术语进行逻辑OR搜索。有关该字段的更多信息,请参见Behavior
$language string 可选的。确定用于搜索的停用词列表以及词干分析器和分词器规则的语言。如果未指定,则搜索使用索引的默认语言。有关支持的语言,请参见Literals 搜寻语言


如果您将语言值指定为"none",则文本搜索将使用简单的标记化,其中没有停用词列表,也没有词干。
| $caseSensitive |布尔值|可选。一个布尔标志,用于启用或禁用区分大小写的搜索。默认为false;即搜索符合text索引不区分大小写。
有关更多信息,请参见Case Insensitivity
版本 3.2 中的新功能。
| $diacriticSensitive |布尔值|可选。一个布尔标志,用于启用或禁用针对版本 3Literals 索引的变音符号敏感搜索。默认为false;即搜索符合text索引的变音符号不敏感。
针对早期版本的文本索引的文本搜索本质上是变音符号敏感的,并且不能是变音符号不敏感的。因此,$diacriticSensitive选项对早期版本的文本索引无效。
有关更多信息,请参见Diacritic Insensitivity
版本 3.2 中的新功能。

默认情况下,$text运算符返回根据结果得分排序的结果。有关按文本搜索分数排序的更多信息,请参见Text Score文档。

Behavior

Restrictions

如果在聚合中使用$text运算符,则以下限制也适用。

$search Field

$search字段中,指定text运算符解析并用于查询text index的单词字符串。

text运算符将字符串中的大多数标点符号视为定界符,除了连字符(__)否定项或指定词组的转义双引号\"除外。

Phrases

要匹配短语而不是单个术语,请将该短语用转义的双引号(\")括起来,如下所示:

"\"ssl certificate\""

如果$search字符串包含短语和单个术语,则文本搜索将仅匹配包含该短语的文档。

例如,传递了一个$search字符串:

"\"ssl certificate\" authority key"

$text运算符搜索短语"ssl certificate"

Negations

用连字符减号(-)前缀的单词会否定一个单词:

$text运算符使用逻辑AND运算符将所有否定添加到查询中。

Match Operation

Stop Words

$text运算符会忽略特定于语言的停用词,例如英语中的theand

Stemmed Words

对于不区分大小写和变音符号的文本搜索,$text运算符匹配完整的* stemmed *词。因此,如果文档字段包含单词blueberry,则对术语blue的搜索将不匹配。但是,blueberryblueberries将匹配。

区分大小写的搜索词和词干

对于case sensitive搜索(即$caseSensitive: true),如果后缀词根包含大写字母,则$text运算符会匹配确切的单词。

变音符号敏感词和词干

对于diacritic sensitive搜索(即$diacriticSensitive: true),如果后缀词根中包含一个或多个变音符号,则$text运算符会匹配确切的单词。

Case Insensitivity

在版本 3.2 中更改。

$text运算符默认为text索引不区分大小写:

$caseSensitive Option

要支持text索引不区分大小写的区分大小写的搜索,请指定$caseSensitive: true

区分大小写的搜索过程

当执行text索引不区分大小写的区分大小写的搜索($caseSensitive: true)时,$text运算符:

对于区分大小写的搜索(即$caseSensitive: true),如果后缀词根包含大写字母,则$text运算符会匹配确切的单词。

指定$caseSensitive: true可能会影响性能。

See also

Stemmed Words

Diacritic Insensitivity

在版本 3.2 中更改。

$text运算符默认为text索引的变音符号不敏感:

$diacriticSensitive Option

要支持针对版本 3 text索引的变音符号敏感文本搜索,请指定$diacriticSensitive: true

针对text索引的早期版本的文本搜索本质上是变音符号敏感的,并且不能变音符号不敏感。因此,$text运算符的$diacriticSensitive选项对text索引的早期版本无效。

变音符号敏感搜索过程

要针对版本 3 text索引执行变音符号敏感文本搜索($diacriticSensitive: true),请使用$text运算符:

指定$diacriticSensitive: true可能会影响性能。

要对早期版本的text索引执行变音符号敏感搜索,$text运算符将搜索对变音符号敏感的text索引。

对于变音符号敏感搜索,如果后缀词根包含一个或多个变音符号,则$text运算符会与确切的单词匹配。

See also

Stemmed Words

Text Score

$text运算符为在索引字段中包含搜索词的每个文档分配一个分数。分数表示文档与给定文本搜索查询的相关性。分数可以是sort()方法规范的一部分,也可以是投影表达式的一部分。 { $meta: "textScore" }表达式提供有关$text操作处理的信息。有关访问投影或排序分数的详细信息,请参见$meta投影运算符。

Examples

以下示例假定集合articles在字段subject上具有版本 3Literals索引:

db.articles.createIndex( { subject: "text" } )

用以下文档填充集合:

db.articles.insert(
   [
     { _id: 1, subject: "coffee", author: "xyz", views: 50 },
     { _id: 2, subject: "Coffee Shopping", author: "efg", views: 5 },
     { _id: 3, subject: "Baking a cake", author: "abc", views: 90  },
     { _id: 4, subject: "baking", author: "xyz", views: 100 },
     { _id: 5, subject: "Café Con Leche", author: "abc", views: 200 },
     { _id: 6, subject: "Сырники", author: "jkl", views: 80 },
     { _id: 7, subject: "coffee and cream", author: "efg", views: 10 },
     { _id: 8, subject: "Cafe con Leche", author: "xyz", views: 10 }
   ]
)

搜索单个单词

以下查询指定$search字符串coffee

db.articles.find( { $text: { $search: "coffee" } } )

此查询返回在索引subject字段中包含术语coffee的文档,或更准确地说,返回单词的词干版本:

{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }
{ "_id" : 7, "subject" : "coffee and cream", "author" : "efg", "views" : 10 }
{ "_id" : 1, "subject" : "coffee", "author" : "xyz", "views" : 50 }

匹配任何搜索词

如果搜索字符串是用空格分隔的字符串,则$text运算符对每个术语执行逻辑OR搜索,并返回包含任何术语的文档。

以下查询指定由空格"bake coffee cake"分隔的三个术语的$search字符串:

db.articles.find( { $text: { $search: "bake coffee cake" } } )

此查询返回在索引subject字段中包含bake coffeecake的文档,或更准确地讲,包含这些单词的词干版本:

{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }
{ "_id" : 7, "subject" : "coffee and cream", "author" : "efg", "views" : 10 }
{ "_id" : 1, "subject" : "coffee", "author" : "xyz", "views" : 50 }
{ "_id" : 3, "subject" : "Baking a cake", "author" : "abc", "views" : 90 }
{ "_id" : 4, "subject" : "baking", "author" : "xyz", "views" : 100 }

搜索词组

要将确切的短语作为单个术语进行匹配,请不要使用引号。

以下查询搜索短语coffee shop

db.articles.find( { $text: { $search: "\"coffee shop\"" } } )

该查询返回包含短语coffee shop的文档:

{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }

See also

Phrases

排除包含术语的文档

术语是以减号-为前缀的术语。如果您否定一个术语,则$text运算符将从结果中排除包含这些术语的文档。

以下示例搜索包含单词coffee但不包含术语shop或更确切地说单词的词干版本的文档:

db.articles.find( { $text: { $search: "coffee -shop" } } )

该查询返回以下文档:

{ "_id" : 7, "subject" : "coffee and cream", "author" : "efg", "views" : 10 }
{ "_id" : 1, "subject" : "coffee", "author" : "xyz", "views" : 50 }

搜索其他语言

使用$text表达式中的可选$language字段来指定一种语言,该语言确定停用词的列表以及搜索字符串的词干分析器和标记生成器的规则。

如果您将语言值指定为"none",则文本搜索将使用简单的标记化,其中没有停用词列表,也没有词干。

以下查询指定es(即西班牙语)作为确定标记,词干和停用词的语言:

db.articles.find(
   { $text: { $search: "leche", $language: "es" } }
)

该查询返回以下文档:

{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200 }
{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz", "views" : 10 }

$text表达式也可以接受名称为spanish的语言。有关支持的语言,请参见Literals 搜寻语言

不区分大小写和变音符号的搜索

在版本 3.2 中更改。

$text运算符针对text索引的大小写和变音符号不敏感。版本 3 text的索引不区分变音符号,并扩展了不区分大小写的范围,以包括西里尔字母以及带有变音符号的字符。有关详细信息,请参见文本索引不区分大小写文本索引变音符号不敏感

以下查询对术语сы́рникиCAFÉS进行大小写和变音符号不敏感的文本搜索:

db.articles.find( { $text: { $search: "сы́рники CAFÉS" } } )

使用版本 3 text索引,该查询与以下文档匹配。

{ "_id" : 6, "subject" : "Сырники", "author" : "jkl", "views" : 80 }
{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200 }
{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz", "views" : 10 }

使用text索引的先前版本,查询将不匹配任何文档。

执行区分大小写的搜索

在版本 3.2 中更改。

要启用区分大小写的搜索,请指定$caseSensitive: true。指定$caseSensitive: true可能会影响性能。

区分大小写的术语

以下查询对术语Coffee进行区分大小写的搜索:

db.articles.find( { $text: { $search: "Coffee", $caseSensitive: true } } )

搜索仅匹配文档:

{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }

区分大小写的短语

以下查询对短语Café Con Leche进行区分大小写的搜索:

db.articles.find( {
   $text: { $search: "\"Café Con Leche\"", $caseSensitive: true }
} )

搜索仅匹配文档:

{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200 }

带有否定词的区分大小写

术语是以减号-为前缀的术语。如果您否定一个术语,则$text运算符将从结果中排除包含这些术语的文档。您还可以为否定的词指定区分大小写。

以下示例对包含单词Coffee但不包含小写字母shop或更确切地说单词的词干版本的文档执行区分大小写的搜索:

db.articles.find( { $text: { $search: "Coffee -shop", $caseSensitive: true } } )

该查询与以下文档匹配:

{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg" }

变音符号敏感搜索

在版本 3.2 中更改。

要针对版本 3 text索引启用变音符号敏感搜索,请指定$diacriticSensitive: true。指定$diacriticSensitive: true可能会影响性能。

变音符号敏感搜索词

以下查询对术语CAFÉ或更确切地说是词的词干版本执行变音符号敏感文本搜索:

db.articles.find( { $text: { $search: "CAFÉ", $diacriticSensitive: true } } )

该查询仅与以下文档匹配:

{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc" }

名词否定的变音符号

$diacriticSensitive选项也适用于否定词。否定词是以减号-为前缀的词。如果您否定一个术语,则$text运算符将从结果中排除包含这些术语的文档。

以下查询对包含词条leches但不包含词条cafés或更确切地说词的词干版本的文档执行变音符号敏感文本搜索:

db.articles.find(
  { $text: { $search: "leches -cafés", $diacriticSensitive: true } }
)

该查询与以下文档匹配:

{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz" }

返回 Literals 搜索分数

以下查询搜索术语cake并返回分配给每个匹配文档的分数:

db.articles.find(
   { $text: { $search: "cake" } },
   { score: { $meta: "textScore" } }
)

返回的文档包括* additional *字段score,该字段包含与文本搜索关联的文档分数。 [1]

See also

Text Score

按 Literals 搜索分数排序

要按文本分数排序,请在投影文档和排序表达式中都包括相同的$meta表达式。 [1]以下查询搜索术语coffee并将结果按降序排序:

db.articles.find(
   { $text: { $search: "coffee" } },
   { score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )

查询返回按降序排序的匹配文档。

See also

Text Score

返回前 2 个匹配的文档

limit()方法与sort()结合使用可返回前n个匹配的文档。

以下查询搜索术语coffee并按降序对结果进行排序,从而将结果限制在前两个匹配的文档中:

db.articles.find(
   { $text: { $search: "coffee" } },
   { score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } ).limit(2)

See also

Text Score

带有附加查询和排序表达式的文本搜索

以下查询搜索author等于"xyz"并且索引字段subject包含术语coffeebake的文档。该操作还指定了date的升序,然后是文本搜索分数的降序:

db.articles.find(
   { author: "xyz", $text: { $search: "coffee bake" } },
   { score: { $meta: "textScore" } }
).sort( { date: 1, score: { $meta: "textScore" } } )
[1] (12) $meta投影运算符的行为和要求与$meta聚合运算符的行为和要求不同。有关$meta聚合运算符的详细信息,请参见$meta聚合运算符参考页。
首页