定义
语法
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 使用以下词条来构造查询:
字段 | 类型 | 说明 | 必要性 |
|---|---|---|---|
| 字符串或字符串数组 | 要搜索的一个或多个字符串。 | 是 |
| 字符串或字符串数组 | 要搜索的一个或多个带索引字段。您还可以指定通配符路径进行搜索。 重要提示:要使用 | 是 |
| 整型 |
| no |
| 对象 | 分配给匹配搜索结果的分数。您可以使用以下选项修改默认分数:
查询大量值时,如果大量中的更多值与查询匹配, MongoDB Search 会分配更高的分数。 有关修改默认评分选项的信息,请参阅对结果中的文档进行评分。 | no |
| 字符串 | Optional |
评分行为
默认情况下,text 操作符使用 bm25 相似度算法根据文档与查询的相关性对文档进行评分。
您可以通过在 similarity.type 属性中为 MongoDB Search 索引定义中的 string 字段指定不同的相似性算法来更改所使用的相似性算法。要了解如何为 string 类型配置 MongoDB Search 索引,请参阅如何索引 String 字段。
要了解有关支持的相似度算法的更多信息,请参阅评分详情。
示例
此页面上的示例使用 sample_mflix 数据库中的 movies 集合。将 示例数据集 加载到集群后,使用动态映射创建 MongoDB Search 索引,并在集群上运行示例查询。要试用同义词示例,还必须将synonymous_terms 集合添加到 sample_mflix 数据库,然后使用 synonyms 映射集合定义索引。
单个短语示例
以下 MongoDB Search 示例在 title 字段中执行查询字符串 new york 的基本搜索。查询中没有 slop,因此 slop 值默认为 0,这意味着 title 字段必须包含具有所有单词的相同位置的精确查询字符串,才能包含在结果中。该查询还包括:
基本示例
以下查询将返回与搜索条件匹配的文档。
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 ])
元数据示例
以下查询返回搜索条件的元数据结果。它使用 $searchMeta 阶段来获取以下桶(年份)中符合搜索条件的电影数量:
2000,包括此存储桶的下限
2005,2000 存储桶的不含上限以及此存储桶的包含下限
2010,2005 存储桶的不含上限以及此存储桶的包含下限
2010,2010 存储桶的独占上限
例子
1 db.movies.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "phrase": { 7 "path": "title", 8 "query": "new york" 9 } 10 }, 11 "facets": { 12 "yearFacet": { 13 "type": "number", 14 "path": "year", 15 "boundaries": [2000, 2005, 2010, 2015 ] 16 } 17 } 18 } 19 } 20 } 21 ])
结果显示,2000 和 2005 之间有 3 部电影,2005 和 2010 之间有 8 部电影,以及 2010 和 2015 之间有 4 部电影,这些电影在 title 中包含术语 new york。
多个短语示例
以下 MongoDB Search 示例在 title 字段中对查询字符串 the man 和 the moon 进行搜索。查询中没有 slop,因此 slop 值默认为 0,这意味着 title 必须包含具有所有单词位置相同的精确查询字符串,才能包含在结果中。该查询还包括:
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "phrase": { 5 "path": "title", 6 "query": ["the man", "the moon"] 7 } 8 } 9 }, 10 { $limit: 10 }, 11 { 12 $project: { 13 "_id": 0, 14 "title": 1, 15 score: { $meta: "searchScore" } 16 } 17 } 18 ])
Slop 示例
以下MongoDB 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 ])
同义词示例
以下查询在 movies集合中的 plot字段中搜索给定查询字符串中的术语。 MongoDB 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同义词,
MongoDB Search 对于搜索car race 或 vehicle race 返回类似的结果,因为我们将 automobile、car 和 vehicle 配置为 equivalent 同义词。但是,automobile contest 的结果不包括带有 race 或 rally 的文档,automobile rally 的结果不包括带有 race 或 contest 的文档,因为我们没有配置 contest或 rally 作为任何术语的同义词。