文本
定义
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 | 文档 | 启用模糊搜索。查找与搜索词相似的字符串。不能将 fuzzy 与 synonyms 一起使用。 | Optional | |||||||||||||||||
fuzzy.maxEdits | 整型 | Optional | ||||||||||||||||||
fuzzy.prefixLength | 整型 | 结果中每个术语开头必须完全匹配的字符数。默认值为 0 。 | Optional | |||||||||||||||||
fuzzy.maxExpansions | 整型 | 生成和搜索变体的最大数量。此限制适用于每个令牌。默认值为 50 。 | Optional | |||||||||||||||||
score | 文档 | 分配给匹配搜索词结果的分数。使用以下选项之一修改分数:
注意当您查询数组中的值时,Atlas Search 不会根据与查询匹配的数组内的值数量更改匹配结果的分数。无论数组内有多少个匹配项,分数都将与单个匹配项相同。 | Optional | |||||||||||||||||
synonyms | 字符串 | 使用同义词运行查询时必需。 索引定义中同义词映射定义的名称。值不能是空字符串。您不能将
注意Atlas Search 执行使用同义词映射的查询所需时间取决于同义词源集合中文档的数量和大小。使用基于很少同义词文档的同义词映射的查询可能比使用基于许多同义词文档的同义词映射的查询更快。 | Optional |
举例
下面的基本示例和模糊示例使用的是 sample_mflix
数据库中的 movies
集合。将示例数据集加载到集群后,为 title
字段创建 Atlas Search 索引,并对集群运行这些示例查询。
提示
如果您已经加载示例数据集,请按照 Atlas Search 入门教程,创建索引定义并运行 Atlas Search 查询。
下面的同义词示例使用user_feedback.comments
和user_feedback.synonyms
集合以及定义同义词映射中描述的索引定义。加载user_feedback.comments
和user_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
选项还是定义了 maxExpansions
、prefixLength
或 maxEdits
字段。
单击以下选项卡,查看使用默认选项和指定选项的查询示例:
例子
以下查询在 title
字段中搜索短语 naw yark
。它使用 fuzzy
默认选项,其中:
maxEdits
允许给定短语中每个术语最多有两个字符变体,以将查询与文档相匹配。maxExpansions
为naw 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 阶段,用于:
排除
_id
和title
之外的所有字段添加字段
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.comments
和 user_feedback.synonyms
集合以及 user_feedback.comments
集合的索引定义的详细信息,请参阅在 Atlas Search 索引中定义您的同义词映射页面中的示例。
equivalent
映射示例
以下查询在 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
配置为 apparel
与 attire
的同义词。Atlas Search 会针对 apparel
和 attire
的搜索返回上述文档,而这也是因为这三个词均被配置为同义词源集合中彼此的同义词。
explicit
映射示例
以下查询在 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
映射将单词 boat
、vessel
和 sail
视为同义词。但是,Atlas Search 不会返回任何关于 vessel
或 sail
的查询结果,因为这两个词均未配置为将任何其他词视为同义词。