在使用 explain 方法运行查询时,MongoDB Search 查询返回有关 $search 查询计划和执行统计信息的信息。在使用 explain 运行查询时,MongoDB Search 返回 BSON 文档,其中包含统计信息和元数据,描述查询在 Lucene 内部的运行方式。
语法
db.<myCollection>.explain("<verbosity>").aggregate([ { $search: { "<operator>": { "<operator-options>" } } } ])
详细程度
详细模式控制 explain 的行为和返回的信息量。值可以是以下之一,按详细程度降序排列:
有关查询计划的信息,包括 | |
有关查询计划的信息,包括 | |
queryPlanner(默认) | 有关查询计划的信息。不包括 |
输出
使用 explain 方法的查询返回 stages.$_internalSearchMongotRemote 对象中的以下字段:
选项 | 类型 | 用途 |
|---|---|---|
| 文档 | 包含您运行的查询。 |
| 文档 | 包含 |
| 整数数组 | 包含 |
解释结果
explain 方法返回一个 BSON 文档,其中包含 explain 文档中的以下字段。
选项 | 类型 | 必要性 | 用途 |
|---|---|---|---|
| 文档 | Optional | 描述收集器的执行统计信息。如果 |
| 文档 | Optional | |
| 文档数组 | Optional | 包含每个索引分区的详细信息。仅当您配置了两个或多个索引分区时,才会返回此信息。 |
| 文档 | Optional | 包含有用的元数据。 |
| 文档 | Optional | 描述查询的执行统计信息。该值不予退回。如果 |
| 文档 | Optional | 有关在查询执行后从 Lucene 检索每个文档数据的详细信息。对于 |
| 文档 | Optional | 详细说明执行查询时的资源使用情况。对于 |
collectors
collectors BSON 文档包含以下字段:
字段 | 类型 | 必要性 | 用途 |
|---|---|---|---|
| 文档 | 必需 | 查询的所有收集器的统计信息。报告的统计信息表示查询中使用的所有收集器的最大值或所有子收集器的统计信息总和。计时统计信息相加求和,以反映整个查询中所有收集器所花费的总时间。要学习;了解详情,请参阅allCollectorStats。 |
| 文档 | Optional | |
| 文档 | Optional |
allCollectorStats
allCollectorStats BSON 文档描述了查询中指定的所有收集器的统计信息,包括 facet 和 sort。它包含以下键:
字段 | 说明 |
|---|---|
| 追踪收集器收集的结果数量和持续时间。 |
| 统计信息跟踪从收集器请求 |
| 统计信息跟踪在收集器上设置记分器的总持续时间和次数。 |
facet
facet 是一个 BSON 文档,当您在查询中指定分面时,该文档会详细说明查询和执行统计信息。它包含以下字段:
选项 | 类型 | 必要性 | 用途 |
|---|---|---|---|
| 文档 | Optional | 仅显示 |
| 文档 | Optional | 显示与创建内部 Lucene 对象相关的统计信息,该对象包含所有分面分组。它包含 |
| 文档 | 必需 | 对于与查询匹配的文档和整个 Lucene 索引,将分面字段映射到其关联基数。它为每个字段提供以下关联基数信息:
|
sort
sort 是一个 BSON 文档,详细说明了在查询中指定 排序 时的查询和执行统计信息。它包含以下字段:
选项 | 类型 | 必要性 | 用途 |
|---|---|---|---|
| 文档 | Optional | 追踪与
|
| 文档 | 必需 | 将正在排序的字段映射到该字段索引中的数据类型列表。 |
| 布尔 | Optional | 指示查询是否可以从索引排序中受益。当查询的排序字段与索引排序匹配或形成其前缀时,查询受益。如果值为:
如果查询未指定排序,或索引没有排序规范,则输出中不存在此内容。 |
highlight
highlight是一个BSON文档,当您在查询中指定突出显示时,它详细说明了查询和执行统计信息。它包含以下字段:
选项 | 类型 | 必要性 | 用途 |
|---|---|---|---|
| 列表<String> | 必需 | 所有高亮字段的列表。如果您在查询的 |
| QueryExecutionArea | Optional | 与设置和执行突出显示相关的调用和计时统计信息。它包含以下字段:
|
indexPartitionExplain
indexPartitionExplain 包含每个索引分区的解释结果。顶层 collectors 和 query 位于每个索引分区的 explain 信息中,而不在顶层。
metadata
metadata 包含有用的元数据,例如:
字段 | 类型 | 必要性 | 用途 |
|---|---|---|---|
| 字符串 | Optional |
|
| 字符串 | Optional | 用于标识 |
| 字符串 | Optional | 查询中使用的MongoDB Search索引。 |
| 文档 | Optional | 为 |
| 整型 | Optional | 索引中包括已删除文档的索引对象总数。 |
query
query BSON 文档描述了查询的执行统计信息。它包含以下字段:
字段 | 类型 | 必要性 | 用途 |
|---|---|---|---|
| 字符串 | Optional | 操作符的路径,前提是它不是根目录。 |
| 字符串 | 必需 | MongoDB Search操作符创建的Lucene查询的名称。有关更多信息,请参阅 |
| 字符串 | Optional | |
| 文档 | 必需 | Lucene 查询信息。有关更多信息,请参阅 |
| 文档 | Optional | 如果 |
args
搜索命令的解释响应包含有关使用该命令执行的查询的信息。args字段中的响应包括MongoDB Search 为满足 $search查询而执行的Lucene查询的结构化详细信息。
本节包含:
MongoDB Search 操作符创建的一些Lucene查询
结构化摘要中包含的 Lucene 查询选项
每个 Lucene 查询类型的 Lucene 查询结构化摘要示例
注意
关于示例
本节中的示例基于对具有 详细程度模式 的 示例数据集queryPlanner 运行的查询。在示例响应中:
mongotQuery字段显示MongoDB Search操作符和运行的查询。explain.type字段显示操作符创建的 Lucene 查询。
有关完整示例,请参阅示例。
BooleanQuery对于 Lucene
BooleanQuery,结构化摘要包含有关以下选项的详细信息:字段类型必要性说明mustOptional
必须匹配的条款。
mustNotOptional
不得匹配的子句。
shouldOptional
应匹配的子句。
filterOptional
必须全部匹配的子句。
minimumShouldMatch整型
Optional
必须匹配的最小
should子句数量。以下示例显示了针对
sample_airbnb.listingsAndReviews集合运行的查询的explain响应。1 { 2 "stages" : [ 3 { 4 "$_internalSearchMongotRemote" : { 5 "mongotQuery" : { 6 "compound" : { 7 "must" : [ { 8 "compound" : { 9 "should" : [ { 10 "text" : { 11 "query" : "historic", 12 "path" : "summary" 13 } 14 }, 15 { 16 "text" : { 17 "query" : "Portugal", 18 "path" : "address.country" 19 } 20 }, 21 { 22 "text" : { 23 "query" : "railway", 24 "path" : "transit" 25 } 26 } ] 27 } 28 } ], 29 "mustNot" : [ { 30 "text" : { 31 "query" : "Apartment", 32 "path" : "property_type" 33 } 34 } ] 35 } 36 }, 37 "explain" : { 38 "type" : "BooleanQuery", 39 "args" : { 40 "must" : [ { 41 "path" : "compound.must", 42 "type" : "BooleanQuery", 43 "args" : { 44 "must" : [ ], 45 "mustNot" : [ ], 46 "should" : [ 47 { 48 "path" : "compound.must.compound.should[0]", 49 "type" : "TermQuery", 50 "args" : { 51 "path" : "summary", 52 "value" : "historic" 53 } 54 }, 55 { 56 "path" : "compound.must.compound.should[1]", 57 "type" : "TermQuery", 58 "args" : { 59 "path" : "address.country", 60 "value" : "portugal" 61 } 62 }, 63 { 64 "path" : "compound.must.compound.should[2]", 65 "type" : "TermQuery", 66 "args" : { 67 "path" : "transit", 68 "value" : "railway" 69 } 70 } 71 ], 72 "filter" : [ ], 73 "minimumShouldMatch" : 0 74 } 75 } ], 76 "mustNot" : [ { 77 "path" : "compound.mustNot", 78 "type" : "TermQuery", 79 "args" : { 80 "path" : "property_type", 81 "value" : "apartment" 82 } 83 } ], 84 "should" : [ ], 85 "filter" : [ ], 86 "minimumShouldMatch" : 0 87 } 88 } 89 }, 90 ... 91 }, 92 ... 93 ], 94 ... 95 }
ConstantScoreQuery对于恒定得分查询,结构化摘要包括以下选项的详细信息:
字段类型必要性说明query必需
ConstantScoreQuery的子项。以下示例显示了针对
sample_airbnb.listingsAndReviews集合运行的查询的explain响应。1 { 2 "stages" : [ 3 { 4 "$_internalSearchMongotRemote" : { 5 "mongotQuery" : { 6 "equals" : { 7 "path" : "host.host_identity_verified", 8 "value" : true 9 } 10 }, 11 "explain" : { 12 "type" : "ConstantScoreQuery", 13 "args" : { 14 "query" : { 15 "type" : "TermQuery", 16 "args" : { 17 "path" : "host.host_identity_verified", 18 "value" : "T" 19 } 20 } 21 } 22 } 23 } 24 }, 25 { 26 "$_internalSearchIdLookup" : { } 27 } 28 ], 29 ... 30 }
FunctionScoreQuery对于 Lucene
FunctionScoreQuery查询,结构化摘要包含有关以下选项的详细信息:字段类型必要性说明scoreFunction字符串
必需
查询中使用的评分表达式。
query必需
查询。
以下示例显示了针对
sample_airbnb.listingsAndReviews集合运行的查询的explain响应。1 { 2 "stages" : [ 3 { 4 "$_internalSearchMongotRemote" : { 5 "mongotQuery" : { 6 "near" : { 7 "path" : "accomodates", 8 "origin" : 8, 9 "pivot" : 2 10 } 11 }, 12 "explain" : { 13 "type" : "BooleanQuery", 14 "args" : { 15 "must" : [ ], 16 "mustNot" : [ ], 17 "should" : [ 18 { 19 "type" : "BooleanQuery", 20 "args" : { 21 "must" : [ ], 22 "mustNot" : [ ], 23 "should" : [ 24 { 25 "type" : "FunctionScoreQuery", 26 "args" : { 27 "scoreFunction" : "expr(pivot / (pivot + abs(origin - value)))", 28 "query" : { 29 "type" : "LongDistanceFeatureQuery", 30 "args" : { }, 31 "stats" : { } 32 } 33 } 34 } 35 ], 36 "filter" : [ 37 { 38 "type" : "PointRangeQuery", 39 "args" : { 40 "path" : "accomodates", 41 "representation" : "double", 42 "gte" : 8.000000000000002, 43 "lte" : NaN 44 } 45 } 46 ], 47 "minimumShouldMatch" : 0 48 } 49 }, 50 { 51 "type" : "LongDistanceFeatureQuery", 52 "args" : { }, 53 "stats" : { } 54 } 55 ], 56 "filter" : [ ], 57 "minimumShouldMatch" : 0 58 } 59 } 60 }, 61 ... 62 }, 63 ... 64 ], 65 ... 66 }
LatLonPointDistanceQuery对于 Lucene
LatLonPointDistanceQuery查询,响应只包含一个stats。以下示例显示了针对
sample_airbnb.listingsAndReviews集合运行的查询的explain响应。1 { 2 "stages" : [ 3 { 4 "$_internalSearchMongotRemote" : { 5 "mongotQuery" : { 6 "geoWithin" : { 7 "path" : "address.location", 8 "circle" : { 9 "radius" : 4800, 10 "center" : { 11 "type" : "Point", 12 "coordinates" : [ 13 -122.419472, 14 37.765302 15 ] 16 } 17 } 18 } 19 }, 20 "explain" : { 21 "type" : "LatLonPointDistanceQuery", 22 "args" : { } 23 } 24 } 25 }, 26 ... 27 ], 28 ... 29 }
LatLonShapeQuery对于 Lucene
LatLonShapeQuery查询,响应只包含一个stats。以下示例显示了针对
sample_airbnb.listingsAndReviews集合运行的查询的explain响应。1 { 2 "stages" : [ 3 { 4 "$_internalSearchMongotRemote" : { 5 "mongotQuery" : { 6 "geoShape" : { 7 "path" : "address.location", 8 "relation" : "within", 9 "geometry" : { 10 "type" : "Polygon", 11 "coordinates" : [ 12 [ 13 [ -74.3994140625, 40.5305017757 ], 14 [ -74.7290039063, 40.5805846641 ], 15 [ -74.7729492188, 40.9467136651 ], 16 [ -74.0698242188, 41.1290213475 ], 17 [ -73.65234375, 40.9964840144 ], 18 [ -72.6416015625, 40.9467136651 ], 19 [ -72.3559570313, 40.7971774152 ], 20 [ -74.3994140625, 40.5305017757 ] 21 ] 22 ] 23 } 24 } 25 }, 26 "explain" : { 27 "type" : "LatLonShapeQuery", 28 "args" : { } 29 } 30 }, 31 ... 32 }, 33 ... 34 ], 35 ... 36 }
LongDistanceFeatureQuery对于 Lucene
LongDistanceFeatureQuery,响应仅包含一个stats。以下示例显示了针对
sample_mflix.movies集合运行的查询的explain响应。1 { 2 "stages" : [ 3 { 4 "$_internalSearchMongotRemote" : { 5 "mongotQuery" : { 6 "near" : { 7 "path" : "released", 8 "origin" : ISODate("1915-09-13T00:00:00Z"), 9 "pivot" : 7776000000 10 } 11 }, 12 "explain" : { 13 "type" : "LongDistanceFeatureQuery", 14 "args" : { } 15 } 16 }, 17 ... 18 }, 19 ... 20 ], 21 ... 22 }
MultiTermQueryConstantScoreWrapper对于 Lucene
MultiTermQueryConstantScoreWrapper查询,结构化摘要包含有关以下参数的详细信息:字段类型必要性说明queries列表<解释结果>
必需
查询列表。
以下示例显示了针对
sample_airbnb.listingsAndReviews集合运行的查询的explain响应。1 { 2 "stages" : [ 3 { 4 "$_internalSearchMongotRemote" : { 5 "mongotQuery" : { 6 "regex" : { 7 "path" : "access", 8 "query" : "full(.{0,5})", 9 "allowAnalyzedField" : true 10 } 11 }, 12 "explain" : { 13 "type" : "MultiTermQueryConstantScoreWrapper", 14 "args" : { 15 "queries" : [ 16 { 17 "type" : "DefaultQuery", 18 "args" : { 19 "queryType" : "RegexpQuery" 20 } 21 } 22 ] 23 } 24 } 25 }, 26 ... 27 }, 28 ... 29 ], 30 ... 31 }
PhraseQuery对于 Lucene
PhraseQuery查询,结构化摘要包含有关以下参数的详细信息:字段类型必要性说明path字符串
必需
要搜索的索引字段。
query字符串
必需
要搜索的一个或多个字符串。
slop数值
必需
query短语中单词之间允许的距离。以下示例显示了针对
sample_airbnb.listingsAndReviews集合运行的查询的explain响应。1 { 2 "stages" : [ 3 { 4 "$_internalSearchMongotRemote" : { 5 "mongotQuery" : { 6 "phrase" : { 7 "path" : "description", 8 "query" : "comfortable apartment", 9 "slop" : 2 10 } 11 }, 12 "explain" : { 13 "type" : "PhraseQuery", 14 "args" : { 15 "path" : "description", 16 "query" : "[comfortable, apartment]", 17 "slop" : 2 18 } 19 } 20 }, 21 ... 22 }, 23 ... 24 ], 25 ... 26 }
PointRangeQuery对于 Lucene
PointRangeQuery查询,结构化摘要包含有关以下参数的详细信息:字段类型必要性说明path字符串
必需
要搜索的索引字段。
representation字符串
Optional
数字表示形式。对日期类型数据的查询不包括表示形式。
gte数值
Optional
查询的下限。
lte数值
Optional
查询的上限。
以下示例显示了针对
sample_airbnb.listingsAndReviews集合运行的查询的explain响应。1 { 2 "stages" : [ 3 { 4 "$_internalSearchMongotRemote" : { 5 "mongotQuery" : { 6 "range" : { 7 "path" : "number_of_reviews", 8 "gt" : 5 9 } 10 }, 11 "explain" : { 12 "type" : "BooleanQuery", 13 "args" : { 14 "must" : [ ], 15 "mustNot" : [ ], 16 "should" : [ 17 { 18 "type" : "PointRangeQuery", 19 "args" : { 20 "path" : "number_of_reviews", 21 "representation" : "double", 22 "gte" : 5.000000000000001 23 } 24 }, 25 { 26 "type" : "PointRangeQuery", 27 "args" : { 28 "path" : "number_of_reviews", 29 "representation" : "int64", 30 "gte" : NumberLong(6) 31 } 32 } 33 ], 34 "filter" : [ ], 35 "minimumShouldMatch" : 0 36 } 37 } 38 }, 39 ... 40 }, 41 ... 42 ], 43 ... 44 }
TermQuery对于术语查询,结构化摘要包括有关以下参数的详细信息:
字段类型必要性说明path字符串
必需
要搜索的索引字段。
value字符串
必需
要搜索的字符串。
以下示例显示了针对
sample_airbnb.listingsAndReviews集合运行的查询的explain响应。1 { 2 "stages" : [ 3 { 4 "$_internalSearchMongotRemote" : { 5 "mongotQuery" : { 6 "queryString" : { 7 "defaultPath" : "summary", 8 "query" : "quiet" 9 } 10 }, 11 "explain" : { 12 "type" : "TermQuery", 13 "args" : { 14 "path" : "summary", 15 "value" : "quiet" 16 } 17 } 18 }, 19 ... 20 }, 21 ... 22 ], 23 ... 24 }
Default未由其他 Lucene 查询显式定义的 Lucene 查询将使用默认查询进行序列化。结构化摘要包含有关以下选项的详细信息:
字段类型必要性说明queryType字符串
必需。
Lucene 查询的类型。
以下示例显示了针对
sample_airbnb.listingsAndReviews集合运行的查询的explain响应。1 { 2 "stages" : [ 3 { 4 "$_internalSearchMongotRemote" : { 5 "mongotQuery" : { 6 "near" : { 7 "origin" : { 8 "type" : "Point", 9 "coordinates" : [ 10 -8.61308, 11 41.1413 12 ] 13 }, 14 "pivot" : 1000, 15 "path" : "address.location" 16 } 17 }, 18 "explain" : { 19 "type" : "DefaultQuery", 20 "args" : { 21 "queryType" : "LatLonPointDistanceFeatureQuery" 22 } 23 } 24 }, 25 ... 26 }, 27 ... 28 ], 29 ... 30 }
stats
executionStats 和 allPlansExecution 详细模式的explain 响应包含一个stats 字段,该字段包含有关查询在 查询执行的各个阶段所 花费的 时间 的信息。
时序细分
时间细分描述了与查询执行区域相关的执行统计信息。以下字段显示时间细分:
查询区域
统计信息可用于以下查询领域:
选项 | 说明 | |||||||
|---|---|---|---|---|---|---|---|---|
| 与 Lucene 查询执行相关的统计信息。 此区域中枚举了两个任务的调用计数:
此区域花费的时间与查询的结构有关,而不是基于迭代和评分的结果数量。 例如: | |||||||
| 与遍历和匹配结果文档相关的统计信息。 此统计信息显示确定下一个匹配的文档所需的时间。 根据查询的性质,匹配结果所花费的时间可能会有很大差异。 此区域中枚举了两个任务的调用计数:
例如: | |||||||
| 与结果集中的文档评分相关的统计信息。 此区域中枚举了两个任务的调用计数:
例如: |
resultMaterialization
resultMaterialization 文档显示 mongot 完成以下任务所需的时间:
检索以
_id或storedSource形式存储在 Lucene 中的结果数据。将数据序列化为 BSON 格式,然后发送到
mongod。
要了解更多信息,请参阅 stats。
resourceUsage
resourceUsage 文档显示了用于运行查询的资源。它包含以下字段:
字段 | 类型 | 必要性 | 用途 |
|---|---|---|---|
| Long | 必需 | 主要页面错误的数量,当系统在查询执行期间无法在内存中找到所需数据,导致从磁盘等后备存储中读取数据时,就会发生这种错误。 |
| Long | 必需 | 次要页面错误的数量,当数据在页面缓存中,但尚未映射到进程的页表时发生。 |
| Long | 必需 | 在用户空间中花费的 CPU 时间,以毫秒为单位。 |
| Long | 必需 | 在系统空间中花费的 CPU 时间,以毫秒为单位。 |
| 整型 | 必需 | 在所有批处理中执行查询期间, |
| 整型 | 必需 | 处理查询时请求 |
示例
以下示例使用 sample_mflix 数据库中的 movies 集合。
提示
如果您已经加载了 示例数据集,请参阅 MongoDB Search 快速入门教程以创建 索引定义并运行 MongoDB Search 查询。
allPlansExecution
以下示例使用不同的操作符以 allPlansExecution 详细模式查询 title 字段。
db.movies.explain("allPlansExecution").aggregate([ { $search: { "text": { "path": "title", "query": "yark", "fuzzy": { "maxEdits": 1, "maxExpansions": 100, } } } } ])
db.movies.explain("allPlansExecution").aggregate([ { $search: { "text": { "path": "title", "query": "prince" }, "highlight": { "path": "title", "maxNumPassages": 1, "maxCharsToExamine": 40 } } }, { $project: { "description": 1, "_id": 0, "highlights": { "$meta": "searchHighlights" } } } ])
db.movies.explain("allPlansExecution").aggregate([ { "$searchMeta": { "facet": { "operator": { "near": { "path": "released", "origin": ISODate("1921-11-01T00:00:00.000+00:00"), "pivot": 7776000000 } }, "facets": { "genresFacet": { "type": "string", "path": "genres" }, "yearFacet" : { "type" : "number", "path" : "year", "boundaries" : [1910,1920,1930,1940] } } } } } ])
db.movies.explain("allPlansExecution").aggregate([ { $search: { "text": { "path": "title", "query": "yark", "fuzzy": { "maxEdits": 1, "maxExpansions": 100, } } } } ])
queryPlanner
以下示例使用不同的操作符以 queryPlanner 详细模式查询 title 字段。
db.movies.explain("queryPlanner").aggregate([ { $search: { "text": { "path": "title", "query": "yark", "fuzzy": { "maxEdits": 1, "maxExpansions": 100, } } } } ])
db.movies.explain("queryPlanner").aggregate([ { $search: { "text": { "path": "title", "query": "prince" }, "highlight": { "path": "title", "maxNumPassages": 1, "maxCharsToExamine": 40 } } }, { $project: { "description": 1, "_id": 0, "highlights": { "$meta": "searchHighlights" } } } ])
db.movies.explain("queryPlanner").aggregate([ { "$searchMeta": { "facet": { "operator": { "near": { "path": "released", "origin": ISODate("1921-11-01T00:00:00.000+00:00"), "pivot": 7776000000 } }, "facets": { "genresFacet": { "type": "string", "path": "genres" }, "yearFacet" : { "type" : "number", "path" : "year", "boundaries" : [1910,1920,1930,1940] } } } } } ])
db.movies.explain("queryPlanner").aggregate([ { $search: { index: "default", range: { path: "released", gt: ISODate("2015-01-01T00:00:00.000Z"), lt: ISODate("2015-12-31T00:00:00.000Z") }, sort: { released: -1 } } }, { $limit: 5 }, { $project: { _id: 0, title: 1, released: 1 } } ])
对于在管道中指定$limit阶段的查询, explain结果包括mongotDocsRequested指标,该指标显示mongod从mongot请求的文档数。
例子
{ "mongotQuery": {}, "explain": {}, "limit": <int>, "sortSpec": {}, "mongotDocsRequested": <int>, }
executionStats
以下示例使用 autocomplete 以 executionStats 详细程度模式查询 title 字段。
1 db.movies.explain("executionStats").aggregate([ 2 { 3 "$search": { 4 "autocomplete": { 5 "path": "title", 6 "query": "pre", 7 "fuzzy": { 8 "maxEdits": 1, 9 "prefixLength": 1, 10 "maxExpansions": 256 11 } 12 } 13 } 14 } 15 ])
要了解有关 explain 响应元素的更多信息,请参阅解释结果。