On this page
$text
在本页面
Definition
$text
- $text对用text index索引的字段的内容执行文本搜索。 $text表达式具有以下语法:
在版本 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表达式。
$text查询不能出现在$elemMatch查询表达式或$elemMatch投影表达式中。
您不能将需要特殊text index的$text表达式与需要不同类型的特殊索引的查询运算符组合在一起。例如,您不能将$text表达式与$near运算符组合。
Views不支持文本搜索。
如果在聚合中使用$text运算符,则以下限制也适用。
text
运算符在该阶段只能出现一次。
$search Field
在$search
字段中,指定text
运算符解析并用于查询text index的单词字符串。
text
运算符将字符串中的大多数标点符号视为定界符,除了连字符(__)否定项或指定词组的转义双引号\"
除外。
Phrases
要匹配短语而不是单个术语,请将该短语用转义的双引号(\"
)括起来,如下所示:
"\"ssl certificate\""
如果$search
字符串包含短语和单个术语,则文本搜索将仅匹配包含该短语的文档。
例如,传递了一个$search
字符串:
"\"ssl certificate\" authority key"
$text运算符搜索短语"ssl certificate"
。
Negations
用连字符减号(-
)前缀的单词会否定一个单词:
否定词会从结果集中排除包含否定词的文档。
传递仅包含否定单词的搜索字符串时,文本搜索将不匹配任何文档。
带连字符的单词(例如
pre-market
)不是负数。如果用于连字词中,$text运算符会将连字符减号(-
)视为定界符。要在这种情况下取反market
,请在pre
和-market
之间包含一个空格,即pre -market
。
$text运算符使用逻辑AND
运算符将所有否定添加到查询中。
Match Operation
Stop Words
$text运算符会忽略特定于语言的停用词,例如英语中的the
和and
。
Stemmed Words
对于不区分大小写和变音符号的文本搜索,$text运算符匹配完整的* stemmed *词。因此,如果文档字段包含单词blueberry
,则对术语blue
的搜索将不匹配。但是,blueberry
或blueberries
将匹配。
区分大小写的搜索词和词干
对于case sensitive搜索(即$caseSensitive: true
),如果后缀词根包含大写字母,则$text运算符会匹配确切的单词。
变音符号敏感词和词干
对于diacritic sensitive搜索(即$diacriticSensitive: true
),如果后缀词根中包含一个或多个变音符号,则$text运算符会匹配确切的单词。
Case Insensitivity
在版本 3.2 中更改。
版本 3Literals 索引对带有或不带有变音符号的拉丁字符以及非拉丁字母(例如西里尔字母)的字符不区分大小写。有关详情,请参见text索引。
text
索引的早期版本对不带变音符号的拉丁字符不区分大小写;即[A-z]
。
$caseSensitive Option
要支持text
索引不区分大小写的区分大小写的搜索,请指定$caseSensitive: true
。
区分大小写的搜索过程
当执行text
索引不区分大小写的区分大小写的搜索($caseSensitive: true
)时,$text运算符:
首先在
text
索引中搜索不区分大小写和变音符的匹配项。然后,为了仅返回与搜索词大小写匹配的文档,$text查询操作包括一个附加阶段,用于过滤出与指定大小写不匹配的文档。
对于区分大小写的搜索(即$caseSensitive: true
),如果后缀词根包含大写字母,则$text运算符会匹配确切的单词。
指定$caseSensitive: true
可能会影响性能。
See also
Diacritic Insensitivity
在版本 3.2 中更改。
版本 3Literals 索引不区分变音符号。也就是说,索引不会区分包含变音标记的字符和未标记对应字符的字符,例如
é
,ê
和e
。text
索引的早期版本对变音符号敏感。
$diacriticSensitive Option
要支持针对版本 3 text
索引的变音符号敏感文本搜索,请指定$diacriticSensitive: true
。
针对text
索引的早期版本的文本搜索本质上是变音符号敏感的,并且不能变音符号不敏感。因此,$text运算符的$diacriticSensitive
选项对text
索引的早期版本无效。
变音符号敏感搜索过程
要针对版本 3 text
索引执行变音符号敏感文本搜索($diacriticSensitive: true
),请使用$text运算符:
首先搜索
text
索引,它不区分变音符号。然后,为了仅返回与搜索词的带变音符号的字符匹配的文档,$text查询操作包括一个附加阶段,用于过滤出不匹配的文档。
指定$diacriticSensitive: true
可能会影响性能。
要对早期版本的text
索引执行变音符号敏感搜索,$text运算符将搜索对变音符号敏感的text
索引。
对于变音符号敏感搜索,如果后缀词根包含一个或多个变音符号,则$text运算符会与确切的单词匹配。
See also
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 }
See also
匹配任何搜索词
如果搜索字符串是用空格分隔的字符串,则$text运算符对每个术语执行逻辑OR
搜索,并返回包含任何术语的文档。
以下查询指定由空格"bake coffee cake"
分隔的三个术语的$search
字符串:
db.articles.find( { $text: { $search: "bake coffee cake" } } )
此查询返回在索引subject
字段中包含bake
或coffee
或cake
的文档,或更准确地讲,包含这些单词的词干版本:
{ "_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 }
See also
搜索词组
要将确切的短语作为单个术语进行匹配,请不要使用引号。
以下查询搜索短语coffee shop
:
db.articles.find( { $text: { $search: "\"coffee shop\"" } } )
该查询返回包含短语coffee shop
的文档:
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }
See also
排除包含术语的文档
负术语是以减号-
为前缀的术语。如果您否定一个术语,则$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 }
See also
搜索其他语言
使用$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 搜寻语言。
See also
不区分大小写和变音符号的搜索
在版本 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 }
See also
区分大小写的短语
以下查询对短语Café Con Leche
进行区分大小写的搜索:
db.articles.find( {
$text: { $search: "\"Café Con Leche\"", $caseSensitive: true }
} )
搜索仅匹配文档:
{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200 }
See also
带有否定词的区分大小写
负术语是以减号-
为前缀的术语。如果您否定一个术语,则$text运算符将从结果中排除包含这些术语的文档。您还可以为否定的词指定区分大小写。
以下示例对包含单词Coffee
但不包含小写字母shop
或更确切地说单词的词干版本的文档执行区分大小写的搜索:
db.articles.find( { $text: { $search: "Coffee -shop", $caseSensitive: true } } )
该查询与以下文档匹配:
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg" }
See also
变音符号敏感搜索
在版本 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" }
See also
名词否定的变音符号
$diacriticSensitive
选项也适用于否定词。否定词是以减号-
为前缀的词。如果您否定一个术语,则$text运算符将从结果中排除包含这些术语的文档。
以下查询对包含词条leches
但不包含词条cafés
或更确切地说词的词干版本的文档执行变音符号敏感文本搜索:
db.articles.find(
{ $text: { $search: "leches -cafés", $diacriticSensitive: true } }
)
该查询与以下文档匹配:
{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz" }
See also
返回 Literals 搜索分数
以下查询搜索术语cake
并返回分配给每个匹配文档的分数:
db.articles.find(
{ $text: { $search: "cake" } },
{ score: { $meta: "textScore" } }
)
返回的文档包括* additional *字段score
,该字段包含与文本搜索关联的文档分数。 [1]
See also
按 Literals 搜索分数排序
要按文本分数排序,请在投影文档和排序表达式中都包括相同的$meta表达式。 [1]以下查询搜索术语coffee
并将结果按降序排序:
db.articles.find(
{ $text: { $search: "coffee" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
查询返回按降序排序的匹配文档。
See also
返回前 2 个匹配的文档
将limit()方法与sort()结合使用可返回前n
个匹配的文档。
以下查询搜索术语coffee
并按降序对结果进行排序,从而将结果限制在前两个匹配的文档中:
db.articles.find(
{ $text: { $search: "coffee" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } ).limit(2)
See also
带有附加查询和排序表达式的文本搜索
以下查询搜索author
等于"xyz"
并且索引字段subject
包含术语coffee
或bake
的文档。该操作还指定了date
的升序,然后是文本搜索分数的降序:
db.articles.find(
{ author: "xyz", $text: { $search: "coffee bake" } },
{ score: { $meta: "textScore" } }
).sort( { date: 1, score: { $meta: "textScore" } } )
See also