【问题标题】:Issue in aggregations in elasticsearch and kibanaelasticsearch 和 kibana 中的聚合问题
【发布时间】:2019-05-18 15:02:22
【问题描述】:

我在 Ubuntu 16.04 LTS 中使用 ELK 版本 6.1.1。

问题陈述:

我有每小时都会登录的日志。首先,我想找到该日志行中特定字段的最大值,现在我想获取其字段值为最大值的日志行,并从该日志行中提取另一个字段的值并显示在矩阵可视化中。

我能够获得该字段的最大值,但我不知道如何获取该日志并从中提取另一个字段。

这就像一个数据库查询 -

从日志中选择 field2 WHERE field1 = 'max(field1)' AND duration = 'selected_duration'

;

谁能帮我解决一下?

谢谢

【问题讨论】:

    标签: elasticsearch kibana elasticsearch-aggregation


    【解决方案1】:
    GET loggs/_search
    {
      "size": 0, 
      "aggs": {
        "NAMEField":{
          "terms": {
            "field": "field2"
          }
        },
        "max_score": {
          "max": {
            "field": "field1"
          }
          }
      },
      "query": {
        "range": {
          "timestamp": {
            "gte": "now-4d/d",
            "lte": "now/d"
          }
        }
      }
    }
    

    【讨论】:

    • 感谢您提出这个想法,所以目前我得到了两个不同的值,即 field1 的值和 field2 的值。现在,如果在同一日志行中找到字段 1 的最大值,我想找到字段 2 的值。
    【解决方案2】:

    您的查询应该是:

    GET  metricbeat-*/_search
      {
      "size": 0, 
      "query": {
        "bool": {
          "must": [
            {
              "range": {
                "@timestamp": {
                  "gte": "now-15m",
                  "lte": "now"
                }
              }
            }
          ]
        }
      },
      "aggs": {
            "allField2": {
              "terms": {
                "field": "field2"
            }
          },
            "maxValue": {
               "max": {
                 "field": "field1"
                    }
            }
    
        }
    }
    

    输出将是:

    {
      "took": 15,
      "timed_out": false,
      "_shards": {
        "total": 65,
        "successful": 65,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1215,
        "max_score": 0,
        "hits": []
      },
      "aggregations": {
        "allField2": {
          "doc_count_error_upper_bound": 0,
          "sum_other_doc_count": 80,
          "buckets": [
            {
              "key": 0.21092499792575836,
              "doc_count": 1
            },
            {
              "key": 0.21797500550746918,
              "doc_count": 1
            },
            {
              "key": 0.22032499313354492,
              "doc_count": 1
            },
            {
              "key": 0.23864999413490295,
              "doc_count": 1
            },
            {
              "key": 0.23907500505447388,
              "doc_count": 1
            },
            {
              "key": 0.24650000035762787,
              "doc_count": 1
            },
            {
              "key": 0.24842500686645508,
              "doc_count": 1
            },
            {
              "key": 0.2488500028848648,
              "doc_count": 1
            },
            {
              "key": 0.2504250109195709,
              "doc_count": 1
            },
            {
              "key": 0.2511749863624573,
              "doc_count": 1
            }
          ]
        },
        "maxValue": {
          "value": 3.1563000679016113
        }
      }
    }
    

    【讨论】:

      【解决方案3】:
      GET loggs/_search
      {
        "size": 0, 
        "aggs": {
          "NAME": {
            "max": {
              "field": "field1"
            }
          }
        },
        "query": {
          "range": {
            "timestamp": {
              "gte": "now-4d/d",
              "lte": "now/d"
            }
          }
        }
      }
      

      【讨论】:

      • Hey Angel,您给出的脚本只给出了字段的最大值,但我想获取另一个字段的值,例如日志行的字段 2,其字段 1 的值在给定的持续时间内是最大值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 2020-02-12
      相关资源
      最近更新 更多