【问题标题】:Histogram is not starting at the right min even filter added即使添加了过滤器,直方图也没有从正确的最小值开始
【发布时间】:2019-12-21 14:20:57
【问题描述】:

映射

          "eventTime": {
            "type": "long"
          },

查询

POST some_indices/_search
{
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
            "range": {                   
              "eventTime": {
                "from": 1563120000000,
                "to": 1565712000000,
                "format": "epoch_millis"
              }
        }
      }
    }
  },
  "aggs": {
      "min_eventTime": { "min" : { "field": "eventTime"} }, 
      "max_eventTime": { "max" : { "field": "eventTime"} }, 
      "time_series": {
        "histogram": {
          "field": "eventTime",
          "interval": 86400000, 
          "min_doc_count" : 0,
          "extended_bounds": {            
            "min": 1563120000000,
            "max": 1565712000000
          }
        }
      }
  }
}

回应

"aggregations": {
    "max_eventTime": {
      "value": 1565539199997
    },
    "min_eventTime": {
      "value": 1564934400000
    },
    "time_series": {
      "buckets": [
        {
          "key": 1563062400000,
          "doc_count": 0
        },
        {
          "key": 1563148800000,
          "doc_count": 0
        },
        {
        ...

问题

作为参考明确提到

对于过滤桶,应该将直方图聚合嵌套在范围过滤聚合下,并使用适当的 from/to 设置。

我正确设置了过滤器(就像demo 所做的那样),minmax 也提供了证据。

但为什么 first key 仍然比 from(或 min_eventTime)SMALLER THAN

太奇怪了,我现在完全迷路了;(

任何建议将不胜感激;)

参考文献

【问题讨论】:

    标签: elasticsearch histogram elasticsearch-5 elasticsearch-aggregation


    【解决方案1】:

    我现在破解了一个解决方案,但我认为这是 Elastic Search 中的一个错误。

    我使用date_histogram 代替,尽管该字段本身是一个长类型并且通过offset 我将起点向前移动到正确的时间戳。

      "aggs": {
        "time_series": {
          "date_histogram": {
            "field": "eventTime",
            "interval": 86400000,
            "offset": "+16h",
            "min_doc_count": 0,
            "extended_bounds": {
              "min": 1563120000000,
              "max": 1565712000000
            }
          },
          "aggs": {
            "order_amount_total": {
              "sum": {
                "field": "order_amount"
              }
            }
          }
        }
      }
    

    更新

    感谢@Val的帮助,我重新考虑了一下,做了如下测试:

        @Test
        public void testComputation() {
            System.out.println(1563120000000L  % 86400000L); // 57600000
            System.out.println(1563062400000L  % 86400000L); // 0
        }
    

    我想引用文档

    使用extended_bounds 设置,您现在可以“强制”直方图聚合开始构建桶on a specific min value 并继续构建桶直至最大值(即使不再有文档)。仅当 min_doc_count 为 0 时使用 extended_bounds 才有意义(如果 min_doc_count 大于 0,则永远不会返回空桶)。

    但我相信specific min value 应该是0, interval, 2 * interval, 3 * interval, .... 之一,而不是我在问题中使用的随机值。

    所以基本上就我而言,我可以使用直方图的offset 来解决以下问题。

    我实际上根本不需要 date_histogram。

           "histogram": {
              "field": "eventTime",
              "interval": 86400000, 
              "offset": 57600000,
              "min_doc_count" : 0,
              "extended_bounds": {            
                "min": 1563120000000,
                "max": 1565712000000
              }
            }
    

    Elastic Search 成员@polyfractal 发布的清晰解释(感谢您提供详细的水晶解释)也证明了相同的逻辑,更多细节可以找到here

    我想在这里引用的设计原因:

    如果我们在extended_bounds.min/max 处截断聚合,我们将生成不是完整区间的桶,这将打破许多关于直方图如何工作的假设。

    【讨论】:

    • 这不是错误,1563120000000 解析为 14.07.2019 at 18:00:00。由于您的直方图间隔设置为一天(即 86400000),因此最小界限四舍五入到 14.07.2019 的开头(即 1563062400000)。您提供 +16h 偏移量的事实可以解决问题,但您的字段最好是 date 字段,以便在您的 date_histogram 聚合中指定您的 timezone
    • @Val 感谢您的帮助,非常感谢;)我再考虑一下,我认为您是对的。我更新了我相信消除我的困惑的答案。谢谢你的帮助;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2019-12-13
    • 2020-12-11
    • 2017-10-24
    • 2019-09-30
    • 1970-01-01
    相关资源
    最近更新 更多