短语
定义
语法
phrase
通过以下语法实现:
1 { 2 $search: { 3 "index": <index name>, // optional, defaults to "default" 4 "phrase": { 5 "query": "<search-string>", 6 "path": "<field-to-search>", 7 "score": <options>, 8 "slop": <distance-number>, 9 "synonyms": "<synonyms-mapping-name>" 10 } 11 } 12 }
选项
phrase
使用以下词条来构造查询:
字段 | 类型 | 说明 | 必要性 |
---|---|---|---|
query | 字符串或字符串数组 | 要搜索的一个或多个字符串。 | 是 |
path | 字符串或字符串数组 | 是 | |
slop | 整型 | query 短语中单词之间允许的距离。较低值允许单词之间的位置距离较小,而较大值允许对单词之间的更多重组和单词之间的距离更大,以满足查询条件。默认值为 0 ,这意味着词语必须与查询位于完全相同的位置才能视为匹配。精确匹配的得分更高。 | no |
score | 对象 | 分配给匹配搜索结果的分数。您可以使用以下选项修改默认分数:
当您查询数组中的值时,Atlas Search 不会根据与查询匹配的数组内的值数量更改匹配结果的分数。无论数组内有多少个匹配项,分数都将与单个匹配项相同。 有关修改默认评分选项的信息,请参阅对结果中的文档进行评分。 | no |
synonyms | 字符串 | 使用同义词运行查询时必需。 索引定义 中 同义词映射定义 的名称。值不能为空字符串。 注意Atlas Search 执行使用同义词映射的查询所需时间取决于同义词源集合中文档的数量和大小。使用基于很少同义词文档的同义词映射的查询可能比使用基于许多同义词文档的同义词映射的查询更快。 | Optional |
举例
本页中的示例使用sample_mflix
数据库中的movies
集合。将示例数据集加载到集群后,使用动态映射创建Atlas Search索引,并在集群上运行示例查询。要尝试同义词示例,您还必须将synonymous_terms集合添加到sample_mflix
数据库,然后使用synonyms
映射集合定义索引。
单个短语示例
以下 Atlas Search 示例在 title
字段中执行查询字符串 new york
的基本搜索。查询中没有 slop
,因此 slop
值默认为 0
,这意味着单词的位置必须与查询字符串完全匹配,才能包含在结果中。该查询还包括:
例子
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "phrase": { 5 "path": "title", 6 "query": "new york" 7 } 8 } 9 }, 10 { $limit: 10 }, 11 { 12 $project: { 13 "_id": 0, 14 "title": 1, 15 score: { $meta: "searchScore" } 16 } 17 } 18 ])
多个短语示例
以下 Atlas Search 示例在 title
字段中对查询字符串 the man
和 the
moon
进行基本搜索。查询中没有 slop
,因此 slop
值默认为 0
,这意味着单词位置必须与查询字符串完全匹配,才能包含在结果中。该查询还包括:
Slop 示例
以下 Atlas Search 示例在title
字段中执行查询字符串men women
的搜索。 query
中5
的 slop
值允许更大的单词移动以及单词men
和women
之间的距离。该查询包括$project
阶段,用于:
排除所有字段,但不包括
title
添加字段
score
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "phrase": { 5 "path": "title", 6 "query": "men women", 7 "slop": 5 8 } 9 } 10 }, 11 { 12 $project: { 13 "_id": 0, 14 "title": 1, 15 score: { $meta: "searchScore" } 16 } 17 } 18 ])
同义词示例
以下查询在plot
movies
集合中的 字段中搜索给定查询字符串中的术语。 Atlas Search根据 同义词源集合 synonymous_terms
中sample_mflix.movies
的映射类型返回结果,该类型 在 集合的索引的同义词映射定义中指定。
以下查询在plot
字段中的任何位置搜索短语automobile race
,词之间的距离最大为5
。
db.movies.aggregate([ { $search: { "phrase": { "path": "plot", "query": "automobile race", "slop": 5, "synonyms": "my_synonyms" } } }, { "$limit": 5 }, { $project: { "_id": 0, "plot": 1, "title": 1, score: { $meta: "searchScore" } } } ])
结果中的文档在plot
字段中包含以下术语,术语之间的距离最大为5
:
automobile
、car
或vehicle
,它们在synonymous_terms
集合中定义为equivalent
同义词,race
、contest
或rally
,它们在 sy``synonymous_terms``集合中定义为explicit
同义词,
Atlas Search会为car race
或vehicle
race
的搜索返回类似的结果,因为我们将automobile
、 car
和vehicle
配置为equivalent
同义词。但是, automobile
contest
的结果不包括带有race
或rally
的文档, automobile rally
的结果不包括带有race
或contest
的文档,因为我们没有配置contest
或rally
作为任何术语的同义词。