【问题标题】:Issue with date Histrogram aggrgation with filter带有过滤器的日期直方图聚合问题
【发布时间】:2020-03-03 02:06:32
【问题描述】:

我正在尝试获取特定时期的时间戳字段的日期直方图。我正在使用以下查询,

{
  "aggs" : {
    "dataRange" : {
      "filter": {"range" : {  "@timestamp" :{ "gte":"2020-02-28T17:20:10Z","lte":"2020-03-01T18:00:00Z" } } },
       "aggs" : {
        "severity_over_time" :{
            "date_histogram" : { "field" : "@timestamp", "interval" : "28m" }
        }}}
  },"size" :0
}

我得到以下结果,

{
  "took": 6,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 32,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  },
  "aggregations": {
    "dataRange": {
      "doc_count": 20,
      "severity_over_time": {
        "buckets": [
          {
            "key_as_string": "2020-02-28T17:04:00.000Z",
            "key": 1582909440000,
            "doc_count": 20
          }
        ]
      }
    }
  }
}

直方图范围的开始(“key_as_string”)超出了我的过滤条件!我的输入过滤器来自“2020-02-28T17:20:10Z”,但结果中的 key_as_string 是“2020-02-28T17:04:00.000Z”,超出了范围过滤器!

我尝试查看文档但无济于事。我在这里遗漏了什么吗?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我想这与 Rangebucket 的计算方式有关。我的理解是,28m 的范围必须始终保持,即桶大小必须一致。

    请注意,28m 的范围差异被完美地保持,并且在某种程度上,第一个和最后一个桶似乎被拉伸以适应这个 28m 范围。

    请注意,从逻辑上讲,您的结果文档都在正确的存储桶中,并且超出过滤范围的文档不会在聚合查询中,无论 key_as_string 是否出现在它们的限制范围内。

    基本上 ES 不保证创建的 range values i.e. key_as_stringstart and end values of buckets 可能准确在您提供的过滤器范围内,但它保证只有文档 根据该范围过滤的查询将被考虑进行评估。

    您可以说桶值是最接近的可能值或近似值。

    如果您想确定过滤后的文档,只需从聚合中删除过滤器并在下面的查询中使用它并删除size: 0

    请注意,我使用了offset,它会更改指定存储桶的起始值。也许那是您正在寻找的东西。

    还有一件事,我使用了min_doc_count,以便您可以过滤掉空桶。

    POST <your_index_name>/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "range": {
                "@timestamp": {
                  "gte": "2020-02-28T17:20:10Z",
                  "lte": "2020-03-01T18:00:01Z"
                }
              }
            }
          ]
        }
      },
      "aggs": {
        "severity_over_time": {
          "date_histogram": {
            "field": "@timestamp",
            "interval": "28m",
            "offset": "+11h",
            "min_doc_count": 1
          }
        }
      }
    }
    

    【讨论】:

    • 感谢卡马尔的详细解释!这有帮助!
    • @PrakashP 如果您认为上述答案已经解决了您的问题,请随时通过单击此链接中提到的向右箭头来投票并接受答案meta.stackexchange.com/a/5235/412539
    • 我从您的解释中得到了解决方案。但是对于除一天之外的时间间隔,偏移量建议让我感到困惑! .例如对于一天的间隔,“+5h”的偏移量表示分桶将在早上 5 点开始。但我无法理解偏移量为“11h”的“28m”间隔。桶间隔只有 28 分钟,但是“11h”的偏移量在这里如何工作?
    • 偏移 +5 并不意味着它从早上 5 点开始。这意味着第一个密钥将从生成的默认密钥时间开始 +5 小时。这个链接会帮助你。 elastic.co/guide/en/elasticsearch/reference/current/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    相关资源
    最近更新 更多