分析查询和聚合

编辑

Elasticsearch 具有强大的 Profile API,可用于检查和分析您的搜索查询。响应会返回一个大型 JSON blob,手动分析可能很困难。

搜索分析器 工具可以将此 JSON 输出转换为易于导航的可视化效果,从而使您可以更快地诊断和调试性能不佳的查询。

开始使用

编辑
  1. 通过使用导航菜单或 全局搜索字段导航到 开发工具 页面,找到 搜索分析器

搜索分析器 显示搜索的索引名称、每个索引中的分片以及查询完成所花费的时间。要试用,请将默认的 match_all 查询替换为要分析的查询,然后单击 分析

以下示例显示了分析 match_all 查询的结果。如果您仔细查看 .security_7 示例索引的信息,累积时间 字段会显示查询执行花费了 0.028 毫秒。

Search Profiler visualization

累积时间指标是各个分片时间的总和。它不一定是查询返回的实际时间(挂钟时间)。因为分片可能在多个节点上并行处理,所以挂钟时间可能比累积时间少得多。但是,如果分片位于同一节点上并串行执行,则挂钟时间会更接近累积时间。

虽然累积时间指标对于比较索引和分片的性能很有用,但它不一定代表实际的物理查询时间。

要查看更多分析信息,请单击 查看详细信息。您将看到有关在分片上运行的查询组件的详细信息以及底层方法的时间分解。有关更多信息,请参阅 分析查询

按索引或类型筛选

编辑

默认情况下,搜索分析器 执行的所有查询都会发送到 GET /_search。它会搜索整个集群(所有索引、所有类型)。

要查询特定索引或类型,可以使用 索引 筛选器。

在以下示例中,查询针对索引 .security-7kibana_sample_data_ecommerce 执行。这等效于向 GET /test,kibana_1/_search 发送请求。

Filtering by index and type

分析更复杂的查询

编辑

要了解查询树在 搜索分析器 内的显示方式,请查看更复杂的查询。

  1. 通过 控制台 索引以下数据

    POST test/_bulk
    {"index":{}}
    {"name":"aaron","age":23,"hair":"brown"}
    {"index":{}}
    {"name":"sue","age":19,"hair":"red"}
    {"index":{}}
    {"name":"sally","age":19,"hair":"blonde"}
    {"index":{}}
    {"name":"george","age":19,"hair":"blonde"}
    {"index":{}}
    {"name":"fred","age":69,"hair":"blonde"}
  2. 搜索分析器 中,在 索引 字段中输入 test,以将分析的查询限制为 test 索引。
  3. 将查询编辑器中的默认 match_all 查询替换为具有两个子查询组件并包含简单聚合的查询

    {
       "query": {
          "bool": {
             "should": [
                {
                   "match": {
                      "name": "fred"
                   }
                },
                {
                   "terms": {
                      "name": [
                          "sue",
                          "sally"
                      ]
                   }
                }
             ]
          }
       },
       "aggs": {
          "stats": {
             "stats": {
                "field": "price"
             }
          }
       }
    }
  4. 单击 分析 以分析查询并将结果可视化。

    Profiling the more complicated query
    • 顶部的 BooleanQuery 组件对应于查询中的 bool。
    • 第二个 BooleanQuery 对应于 terms 查询,它在内部转换为 should 子句的 Boolean。它有两个子查询,对应于 terms 查询中的 "sally" 和 "sue。
    • 标记为 "name:fred" 的 TermQuery 对应于查询中的 match: fred。

      如果您查看时间列,您会发现 自身时间总时间 在所有行上不再相同。自身时间 表示查询组件执行所花费的时间。总时间 是查询组件及其所有子组件执行所花费的时间。因此,像 Boolean 查询这样的查询的总时间通常比自身时间长。

  5. 单击 聚合分析 以查看聚合分析统计信息。

    此查询包括 "age" 字段上的 stats 聚合。仅当要分析的查询包含聚合时,才会启用 聚合分析 选项卡。

  6. 单击 查看详细信息 以查看时间分解。

    Drilling into the first shard’s details

    有关 搜索分析器 的工作原理、时间计算方式以及如何解释各种结果的更多信息,请参阅 分析查询

渲染预先捕获的分析器 JSON

编辑

搜索分析器 查询 Kibana 节点所连接的集群。它通过针对集群执行查询并收集结果来实现此目的。

有时您可能希望调查本质上是暂时的性能问题。例如,当许多客户正在使用您的系统时,查询可能只在一天中的某些时候变慢。您可以设置一个流程,以在慢查询发生时自动分析它们,然后保存这些分析响应以供以后分析。

搜索分析器 通过允许您将预先捕获的 JSON 粘贴到查询编辑器中来支持此工作流程。搜索分析器 将检测到您已输入 JSON 响应(而不是查询),并且只会呈现可视化效果,而不是查询集群。

要查看其工作原理,请将以下分析响应复制并粘贴到查询编辑器中,然后单击 分析

{
   "took": 3,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 1.3862944,
      "hits": [
         {
            "_index": "test",
            "_type": "test",
            "_id": "AVi3aRDmGKWpaS38wV57",
            "_score": 1.3862944,
            "_source": {
               "name": "fred",
               "age": 69,
               "hair": "blonde"
            }
         }
      ]
   },
   "profile": {
      "shards": [
         {
            "id": "[O-l25nM4QN6Z68UA5rUYqQ][test][0]",
            "searches": [
               {
                  "query": [
                     {
                        "type": "BooleanQuery",
                        "description": "+name:fred #(ConstantScore(*:*))^0.0",
                        "time": "0.5884370000ms",
                        "breakdown": {
                           "score": 7243,
                           "build_scorer_count": 1,
                           "match_count": 0,
                           "create_weight": 196239,
                           "next_doc": 9851,
                           "match": 0,
                           "create_weight_count": 1,
                           "next_doc_count": 2,
                           "score_count": 1,
                           "build_scorer": 375099,
                           "advance": 0,
                           "advance_count": 0
                        },
                        "children": [
                           {
                              "type": "TermQuery",
                              "description": "name:fred",
                              "time": "0.3016880000ms",
                              "breakdown": {
                                 "score": 4218,
                                 "build_scorer_count": 1,
                                 "match_count": 0,
                                 "create_weight": 132425,
                                 "next_doc": 2196,
                                 "match": 0,
                                 "create_weight_count": 1,
                                 "next_doc_count": 2,
                                 "score_count": 1,
                                 "build_scorer": 162844,
                                 "advance": 0,
                                 "advance_count": 0
                              }
                           },
                           {
                              "type": "BoostQuery",
                              "description": "(ConstantScore(*:*))^0.0",
                              "time": "0.1223030000ms",
                              "breakdown": {
                                 "score": 0,
                                 "build_scorer_count": 1,
                                 "match_count": 0,
                                 "create_weight": 17366,
                                 "next_doc": 0,
                                 "match": 0,
                                 "create_weight_count": 1,
                                 "next_doc_count": 0,
                                 "score_count": 0,
                                 "build_scorer": 102329,
                                 "advance": 2604,
                                 "advance_count": 2
                              },
                              "children": [
                                 {
                                    "type": "MatchAllDocsQuery",
                                    "description": "*:*",
                                    "time": "0.03307600000ms",
                                    "breakdown": {
                                       "score": 0,
                                       "build_scorer_count": 1,
                                       "match_count": 0,
                                       "create_weight": 6068,
                                       "next_doc": 0,
                                       "match": 0,
                                       "create_weight_count": 1,
                                       "next_doc_count": 0,
                                       "score_count": 0,
                                       "build_scorer": 25615,
                                       "advance": 1389,
                                       "advance_count": 2
                                    }
                                 }
                              ]
                           }
                        ]
                     }
                  ],
                  "rewrite_time": 168640,
                  "collector": [
                     {
                        "name": "CancellableCollector",
                        "reason": "search_cancelled",
                        "time": "0.02952900000ms",
                        "children": [
                           {
                              "name": "SimpleTopScoreDocCollector",
                              "reason": "search_top_hits",
                              "time": "0.01931700000ms"
                           }
                        ]
                     }
                  ]
               }
            ],
            "aggregations": []
         }
      ]
   }
}

您的输出应类似于此

Rendering pre-captured profiler JSON