“文档” 菜单
文档首页
/
MongoDB 阿特拉斯
/ / / /

文本

在此页面上

  • 定义
  • 语法
  • 字段
  • 举例
  • 基本示例
  • 模糊示例
  • 同义词示例

text操作符使用您在 索引配置 中指定的 分析器 执行全文搜索。如果省略分析器,text 操作符将使用默认的 标准 分析器。

text 通过以下语法实现:

{
$search: {
"index": <index name>, // optional, defaults to "default"
"text": {
"query": "<search-string>",
"path": "<field-to-search>",
"fuzzy": <options>,
"score": <options>,
"synonyms": "<synonyms-mapping-name>"
}
}
}
字段
类型
说明
必要性
query
字符串或字符串数组
要搜索的一个或多个字符串。如果字符串中有多个词,Atlas Search 还会分别为字符串中的每个词查找匹配项。
必需
path
字符串或字符串数组
要搜索的带索引字段。还可以指定通配符路径进行搜索。有关更多信息,请参阅路径构造
必需
fuzzy
文档
启用模糊搜索。查找与搜索词相似的字符串。不能将 fuzzysynonyms 一起使用。
Optional
fuzzy.maxEdits
整型
匹配指定搜索词所需的最大单字符编辑数。值可以是 12。默认值是 2。使用Damerau-Levenshtein 距离。
Optional
fuzzy.prefixLength
整型
结果中每个术语开头必须完全匹配的字符数。默认值为 0
Optional
fuzzy.maxExpansions
整型
生成和搜索变体的最大数量。此限制适用于每个令牌。默认值为 50
Optional
score
文档

分配给匹配搜索词结果的分数。使用以下选项之一修改分数:

  • boost将生成的分数乘以给定数字。

  • constant将结果分数替换为给定数字。

  • function:使用给定的表达式替换结果分数。

注意

当您查询数组中的值时,Atlas Search 不会根据与查询匹配的数组内的值数量更改匹配结果的分数。无论数组内有多少个匹配项,分数都将与单个匹配项相同。

Optional
synonyms
字符串

使用同义词运行查询时必需。

索引定义同义词映射定义的名称。值不能是空字符串。您不能将 fuzzysynonyms 一起使用。

text 使用同义词的查询会查找查询标记的连词 (AND)。text不使用同义词的查询搜索查询标记的析取 (OR)。要运行使用同义词的 text 查询并同时搜索查询令牌的析取 (OR),请使用复合操作符。 例如:

"compound": {
"should": [
{
"text": {
"path": "a",
"query": "my query",
"synonyms": "mySynonyms"
}
},
{
"text": {
"path": "a",
"query": "my query"
}
}
]
}

注意

Atlas Search 执行使用同义词映射的查询所需时间取决于同义词源集合中文档的数量和大小。使用基于很少同义词文档的同义词映射的查询可能比使用基于许多同义词文档的同义词映射的查询更快。

Optional

下面的基本示例和模糊示例使用的是 sample_mflix 数据库中的 movies 集合。将示例数据集加载到集群后,为 title 字段创建 Atlas Search 索引,并对集群运行这些示例查询。

提示

如果您已经加载示例数据集,请按照 Atlas Search 入门教程,创建索引定义并运行 Atlas Search 查询。

下面的同义词示例使用user_feedback.commentsuser_feedback.synonyms集合以及定义同义词映射中描述的索引定义。加载user_feedback.commentsuser_feedback.synonyms集合并配置集合的索引定义后,您可以运行以下查询。

以下 Atlas Search 示例使用 text 操作符在 movies 集合的 title 字段中搜索 surfer 一词。

例子

以下查询在title字段中搜索surfer一词。它包括一个$project阶段,用于:

  • 排除所有字段,但不包括 title

  • 添加字段 score

db.movies.aggregate([
{
$search: {
"text": {
"path": "title",
"query": "surfer"
}
}
},
{
$project: {
"_id": 0,
"title": 1,
score: { $meta: "searchScore" }
}
}
])

以上查询返回以下结果:

{ "title" : "Soul Surfer", "score" : 4.572484970092773 }
{ "title" : "Little Surfer Girl", "score" : 3.9323642253875732 }
{ "title" : "Fantastic 4: Rise of the Silver Surfer", "score" : 2.520784616470337 }

以下查询使用 text 运算符在 movies 集合内的 title 字段中搜索某些词,而这些词位于query短语 naw yark 中每个词的一个字符变体内。Atlas Search 会返回不同结果,具体取决于您使用的是默认 fuzzy 选项还是定义了 maxExpansionsprefixLengthmaxEdits 字段。

单击以下选项卡,查看使用默认选项和指定选项的查询示例:

例子

以下查询在 title 字段中搜索短语 naw yark。它使用 fuzzy 默认选项,其中:

  • maxEdits 允许给定短语中每个术语最多有两个字符变体,以将查询与文档相匹配。

  • maxExpansionsnaw yark中的每个词语考虑最多五十个相似词语以查找匹配项。

  • prefixLength 已禁用。

该查询还包括一个 $limit 阶段,用于将输出限制为 10 个结果,以及一个 $project 阶段,用于:

  • 排除所有字段,但不包括 title

  • 添加字段 score

db.movies.aggregate([
{
$search: {
"text": {
"path": "title",
"query": "naw yark",
"fuzzy": {}
}
}
},
{
$limit: 10
},
{
$project: {
"_id": 0,
"title": 1,
score: { $meta: "searchScore" }
}
}
])

以上查询返回以下结果:

{ "title" : "New York, New York", "score" : 4.392756462097168 }
{ "title" : "New York", "score" : 4.050914287567139 }
{ "title" : "New York Stories", "score" : 3.4838104248046875 }
{ "title" : "New York Minute", "score" : 3.4838104248046875 }
{ "title" : "Synecdoche, New York", "score" : 3.4838104248046875 }
{ "title" : "New York Doll", "score" : 3.4838104248046875 }
{ "title" : "Little New York", "score" : 3.4838104248046875 }
{ "title" : "Escape from New York", "score" : 3.0559897422790527 }
{ "title" : "King of New York", "score" : 3.0559897422790527 }
{ "title" : "Naked in New York", "score" : 3.0559897422790527 }

例子

以下查询会在 title 字段中搜索与字符串 naw yark 中每个术语相差一个字符以内的术语。它使用:

  • maxEdits字段表示只允许使用一种字符变体,以便将查询与文档匹配。

  • maxExpansions 字段表示将查询与文档进行匹配时,必须考虑最多一百个与 naw 相似的术语和一百个与 yark 相似的术语。

该查询还包括一个 $limit 阶段,用于将输出限制为 10 个结果,以及一个 $project 阶段,用于:

  • 排除所有字段,但不包括 title

  • 添加字段 score

db.movies.aggregate([
{
$search: {
"text": {
"path": "title",
"query": "naw yark",
"fuzzy": {
"maxEdits": 1,
"maxExpansions": 100,
}
}
}
},
{
$limit: 10
},
{
$project: {
"_id": 0,
"title": 1,
score: { $meta: "searchScore" }
}
}
])

以上查询返回以下结果:

{ "title" : "New York, New York", "score" : 4.392756462097168 }
{ "title" : "New York", "score" : 4.050914287567139 }
{ "title" : "New York Stories", "score" : 3.4838104248046875 }
{ "title" : "New York Minute", "score" : 3.4838104248046875 }
{ "title" : "Synecdoche, New York", "score" : 3.4838104248046875 }
{ "title" : "New York Doll", "score" : 3.4838104248046875 }
{ "title" : "Little New York", "score" : 3.4838104248046875 }
{ "title" : "Escape from New York", "score" : 3.0559897422790527 }
{ "title" : "King of New York", "score" : 3.0559897422790527 }
{ "title" : "Naked in New York", "score" : 3.0559897422790527 }

例子

以下查询会在 title 字段中搜索与字符串 naw yark 中每个术语相差一个字符以内的术语。它使用:

  • maxEdits字段表示只允许使用一种字符变体来将查询与文档相匹配。

  • prefixLength 字段表示不得更改字符串 naw yark 中每个术语的前两个字符以将查询与文档匹配。

该查询还包括一个 $limit 阶段,用于将输出限制为 8 个结果,以及一个 $project 阶段,用于:

  • 排除 _idtitle 之外的所有字段

  • 添加字段 score

db.movies.aggregate([
{
$search: {
"text": {
"path": "title",
"query": "naw yark",
"fuzzy": {
"maxEdits": 1,
"prefixLength": 2,
}
}
}
},
{
$limit: 8
},
{
$project: {
"_id": 1,
"title": 1,
score: { $meta: "searchScore" }
}
}
])

以上查询返回以下结果:

{ "_id" : ObjectId("573a1396f29313caabce5646", "title" : "The Longest Yard", "score" : 2.949273109436035 }
{ "_id" : ObjectId("573a13aff29313caabd31ed8", "title" : "The Longest Yard", "score" : 2.949273109436035 }
{ "_id" : ObjectId("573a13b7f29313caabd4ad8b", "title" : "Stomp the Yard", "score" : 2.949273109436035 }
{ "_id" : ObjectId("573a13eaf29313caabdcf410", "title" : "Naz & Maalik", "score" : 2.581432342529297 }
{ "_id" : ObjectId("573a1393f29313caabcddbed", "title" : "La nao capitana", "score" : 2.2200469970703125 }
{ "_id" : ObjectId("573a1399f29313caabcee781", "title" : "Kabhi Haan Kabhi Naa", "score" : 1.9474197626113892 }
{ "_id" : ObjectId("573a13a2f29313caabd0b815", "title" : "Kaho Naa... Pyaar Hai", "score" : 1.9474197626113892 }
{ "_id" : ObjectId("573a13a7f29313caabd1b5c0", "title" : "Oysters at Nam Kee's", "score" : 1.9474197626113892 }

以下示例使用 text 操作符搜索 user_feedback.comments 集合中的 comments 字段。Atlas Search 根据在 user_feedback.comments 集合的索引的同义词映射定义中指定的 user_feedback.synonyms 同义词源集合中的映射类型返回结果。

注意

要了解有关 user_feedback.commentsuser_feedback.synonyms 集合以及 user_feedback.comments 集合的索引定义的详细信息,请参阅在 Atlas Search 索引中定义您的同义词映射页面中的示例

以下查询在 comments 字段中搜索单词 dress。其使用集合索引中名为 mySynonyms 同义词映射来搜索配置为单词 dress 同义词的单词。

db.comments.aggregate([
{
$search: {
"text": {
"path": "comments",
"query": "dress",
"synonyms": "mySynonyms"
}
}
}
])

上述查询返回以下结果:

{
"_id" : ObjectId("60e5f7d65f32d78cb3a3cc7a"),
"type" : "apparel store",
"comments" : "Beautiful apparel for the bride."
}

Atlas Search 会返回上述文档,因为使用了同义词源集合 user_feedback.synonyms 中的 equivalent 映射将 dress 配置为 apparelattire 的同义词。Atlas Search 会针对 apparelattire 的搜索返回上述文档,而这也是因为这三个词均被配置为同义词源集合中彼此的同义词。

以下查询在 comments 字段中搜索单词 boat。其使用集合索引中名为 mySynonyms 同义词映射来搜索配置为单词 boat 同义词的单词。

db.comments.aggregate([
{
$search: {
"text": {
"path": "comments",
"query": "boat",
"synonyms": "mySynonyms"
}
}
}
])

上述查询返回以下结果:

{
"_id" : ObjectId("60e5f7e25f32d78cb3a3cdc4"),
"type" : "recreation rental",
"comments" : "Sails as well as the day it was made."
}

Atlas Search 返回上述文档,因为 boat 配置为使用同义词源集合 user_feedback.synonyms 中的 explicit 映射将单词 boatvesselsail 视为同义词。但是,Atlas Search 不会返回任何关于 vesselsail 的查询结果,因为这两个词均未配置为将任何其他词视为同义词。

后退

span(已弃用)

来年

通配符