对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

text (MongoDB搜索操作符)

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

您可以使用 text 操作符来搜索单词术语的准确匹配。

text 通过以下语法实现:

{ $search: { "index": <index name>, // optional, defaults to "default" "text": { "query": "<search-string>", "path": "<field-to-search>", "fuzzy": <options>, "matchCriteria": "any" | "all" "score": <options>, "synonyms": "<synonyms-mapping-name>" } }}

text 使用以下词条来构造查询:

字段
类型
说明
必要性

query

字符串或字符串数组

要搜索的一个或多个字符串。 如果字符串中有多个词, MongoDB Search 还会分别为字符串中的每个术语查找匹配项。

必需

path

字符串或字符串数组

索引字段或要搜索的字段。您还可以指定通配符路径进行搜索。

必需

fuzzy

文档

启用模糊搜索。查找与搜索词相似的字符串。不能将 fuzzy 与 synonyms 一起使用。

Optional

fuzzy.maxEdits

整型

匹配指定搜索术语所需的最大单字符编辑数。值可以是 1 或 2。默认值为 2。使用 Damerau-Lvenshtein 距离。

Optional

fuzzy.prefixLength

整型

结果中每个术语开头必须完全匹配的字符数。默认值为 0。

Optional

fuzzy.maxExpansions

整型

要生成和搜索的最大变体数量。此限制适用于每个令牌。默认值为 50。

Optional

matchCriteria

字符串

用于匹配查询中术语的条件。如果省略,则默认值为 any。值可以是以下值之一:

  • any - 返回包含 query 字段中任何术语的文档。

  • all - 仅返回包含 query 字段中所有术语的文档。

可选,但建议使用

score

文档

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

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

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

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

查询大量值时,如果大量中的更多值与查询匹配, MongoDB Search 会分配更高的分数。

Optional

synonyms

字符串

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

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

重要提示:要使用 synonyms选项,必须将查询字段索引为 类型,并将string indexOptions属性设立为positions 或默认值offsets 。要学习;了解详情,请参阅配置字符串字段属性。

使用 synonyms 时始终使用 matchCriteria。对于使用 synonyms 而不使用 matchCriteria 的 text 查询, MongoDB Search 仅匹配所有词语均位于与查询完全相同位置的文档。这种行为将来可能会发生变化,您的查询结果也可能会发生变化。

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

Optional

默认情况下,text 操作符使用 bm25 相似度算法根据文档与查询的相关性对文档进行评分。

您可以通过在 similarity.type 属性中为 MongoDB Search 索引定义中的 string 字段指定不同的相似性算法来更改所使用的相似性算法。要了解如何为 string 类型配置 MongoDB Search 索引,请参阅如何索引 String 字段。

要了解有关支持的相似度算法的更多信息,请参阅评分详情。

对于使用 synonyms 而不使用 matchCriteria 的 text 查询, MongoDB Search 仅匹配包含查询词语(带或不带扩展同义词)完全匹配的文档。

这种行为将来可能会发生变化,您的查询结果也可能会发生变化。为了避免服务中断,请在使用 synonyms 时始终使用 matchCriteria。或者,请使用 phrase 操作符的同义词。

例如,假设 nyc 和 new york city 的同义词映射是等效的。对 i like nyc 的搜索将返回以下内容:

操作符规范
默认行为
"matchCriteria": "any"
"matchCriteria": "all"

text 没有 synonyms

i 或 like 或 nyc 的匹配项

i 或 like 或 nyc 的匹配项

i 和 like 和 nyc 的匹配项

text 通过 synonyms

i like nyc 或 i like new york city 的匹配项

i 或 like 或(nyc 或 new york city)的匹配项

i 和 like 并且 (nyc 或 new york city) 的匹配项

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

此页面上的示例使用 sample_mflix 数据库中的 movies 集合。将 示例数据集 加载到集群后,使用动态映射创建 MongoDB Search 索引,并在集群上运行示例查询。您还必须在索引中定义 synonyms 映射集合,如 索引定义示例 所示,以尝试下面的 同义词 示例。

以下 MongoDB Search 查询使用 text 操作符在 movies 集合的 title 字段中搜索术语 surfer。它包含 $project 阶段,用于:

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

  • 添加字段 score

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

以下查询在 title术语中搜索 summer字段。它使用 $searchMeta 阶段检索以下存储桶(年份)中与搜索条件匹配的电影数量:

  • 1970,包括此存储桶的下限

  • 1980,1970 存储桶的不含上限以及此存储桶的包含下限

  • 1990,1980 存储桶的不含上限以及此存储桶的包含下限

  • 2000,1990 存储桶的不含上限以及此存储桶的包含下限

  • 2010,2000 存储桶的不含上限以及此存储桶的包含下限

  • 2015,2010 存储桶的独占上限

db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "text": { "path": "title", "query": "summer" } }, "facets": { "yearFacet": { "type": "number", "path": "year", "boundaries": [1970, 1980, 1990, 2000, 2010, 2020 ] } } } } }])

以下查询使用 text操作符在 movies集合中的 title字段中搜索某些词,而这些词位于 query 短语 naw yark 中每个术语的一个字符变体内。MongoDB 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" } } }])

以下查询使用 text 操作符在 movies 集合中的 plot 字段中搜索查询字符串 automobile race 中的所有术语。

db.movies.aggregate([ { "$search": { "text": { "path": "plot", "query": "automobile race", "matchCriteria": "all" } } }, { "$limit": 20 }, { "$project": { "_id": 0, "plot": 1, "title": 1, "score": { "$meta": "searchScore" } } }])
[ { plot: 'A young driver, Speed Racer, aspires to be champion of the racing world with the help of his family and his high-tech Mach 5 automobile.', title: 'Speed Racer', score: 6.122188568115234 }, { plot: 'A gorgeous young automobile fanatic--and front to the hottest unsigned band on the West coast--finds herself caught up in illegal drag-racing competitions organized by exotic car fanatics.', title: 'Redline', score: 5.497724533081055 }, { plot: 'When a popular daredevil proposes an automobile race across three continents, his arch rival vows to beat him, while an ambitious female reporter has her own plans for victory.', title: 'The Great Race', score: 5.282209396362305 }]

MongoDB Search 返回在 plot字段中任何位置包含术语 automobile 和 race 的文档。

以下示例使用 text操作符搜索sample_mflix.movies命名空间中的 plot字段。MongoDB Search 根据映射类型和同义词源集合synonymous_terms 中的映射类型返回结果,该类型在 sample_mflix.movies集合的索引的同义词映射定义中指定。

以下查询在 plot 字段中搜索短语 attire。它还使用集合索引中名为 mySynonyms 的同义词映射来搜索配置为单词 dress 的同义词的单词。

db.movies.aggregate([ { "$search": { "text": { "path": "plot", "query": "attire", "synonyms": "my_synonyms", "matchCriteria": "any" } } }, { "$limit": 5 }, { "$project": { "_id": 0, "plot": 1, "title": 1, "score": { "$meta": "searchScore" } } }])

MongoDB Search 返回包含术语 attire、apparel 和 dress 的文档,因为我们将所有这些术语配置为同义词源集合synonymous_terms 中的 equivalent 同义词,这平均值所有这些术语都是同义词。因此, MongoDB Search 会为 dress 和 attire 的搜索返回类似的文档。

以下查询在 plot 字段中搜索短语 boat race。它还使用集合索引中名为 my_synonyms 的同义词映射来搜索配置为单词 boat 和 race 的同义词的单词。

db.movies.aggregate([ { "$search": { "text": { "path": "plot", "query": "boat race", "synonyms": "my_synonyms", "matchCriteria": "any" } } }, { "$limit": 10 }, { "$project": { "_id": 0, "plot": 1, "title": 1, "score": { "$meta": "searchScore" } } }])

MongoDB Search 会返回包含术语boat、vessel,、sail 或 race、rally 或 contest 的文档,因为我们将 boat 配置为 explicit 同义词或 vessel和 sail,并且我们将 race 配置为 rally 和 contest 的 explicit 同义词。MongoDB Search 不会返回任何关于 vessel 和 sail 或 rally 和 contest 的查询结果,因为我们没有将这些单词配置为将任何其他单词视为同义词。

以下查询使用 text 操作符在 movies 集合中的 plot 字段中搜索查询字符串 automobile race 中的所有词语。

MongoDB Search 根据映射类型在同义词源集合synonymous_terms 中的映射类型返回结果,该类型在 sample_mflix.movies集合的索引的同义词映射定义中指定。

db.movies.aggregate([ { "$search": { "text": { "path": "plot", "query": "automobile race", "matchCriteria": "all", "synonyms": "my_synonyms" } } }, { "$limit": 20 }, { "$project": { "_id": 0, "plot": 1, "title": 1, "score": { "$meta": "searchScore" } } }])

MongoDB Search 返回包含查询词 automobile、car 或 vehicle 以及 race、context 或 rally 的文档,因为我们将 automobile、vehicle 和 car 配置为是 equivalent 同义词,并且我们在 synonymous_terms集合中将 rally 和 contest 配置为 race 的 explicit 同义词。