配置文件查询和聚合

编辑

配置文件查询和聚合编辑

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

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

入门编辑

搜索分析器 在 Kibana 中自动启用。打开主菜单,单击 Dev Tools,然后单击 搜索分析器 开始使用。

搜索分析器 显示搜索的索引名称、每个索引中的分片以及查询完成所需的时间。要试用它,请将默认的 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。

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

  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