elasticsearch 基于持续时间的Elasticsearch日期直方图聚合,elasticsearch,elasticsearch" /> elasticsearch 基于持续时间的Elasticsearch日期直方图聚合,elasticsearch,elasticsearch" />

elasticsearch 基于持续时间的Elasticsearch日期直方图聚合

elasticsearch 基于持续时间的Elasticsearch日期直方图聚合,elasticsearch,elasticsearch,我在Elasticsearch中处理的文档具有表示为开始和结束时间的持续时间概念,例如 { issueId: 1, issuePriority: 3, timeWindow: { start: "2015-10-14T17:00:00-07:00", end: "2015-10-14T18:00:00-07:00" } }, { issueId: 2, issuePriority: 1, timeWindow: { start: "2015-1

我在Elasticsearch中处理的文档具有表示为开始和结束时间的持续时间概念,例如

{
  issueId: 1,
  issuePriority: 3,
  timeWindow: {
    start: "2015-10-14T17:00:00-07:00",
    end: "2015-10-14T18:00:00-07:00"
  }
},
{
  issueId: 2,
  issuePriority: 1,
  timeWindow: {
    start: "2015-10-14T16:50:00-07:00",
    end: "2015-10-14T17:50:00-07:00"
  }
}
我的目标是生成一个柱状图,将问题数量及其最大优先级聚合到15分钟的存储桶中。因此,对于上面的示例,
问题#1
将被放入
17:00
17:15
17:30
17:45
桶中,不多也不少

我尝试使用
date\u直方图
聚合,例如:

aggs: {
  max_priority_over_time: {
    date_histogram: {
      field: "timeWindow.start",
      interval: "15minute",
    },
    aggs: {
      max_priority: ${top_hits_aggregation}
    }
  }
}

但很明显,它只是将
问题#1
放入
17:00
桶中。即使我考虑到
timeWindow.end
,它也只会添加到
18:00
存储桶中。有人知道我如何使用
date\u直方图
或其他Elasticsearch聚合来实现这一点吗?可能会在
timeWindow.start
timeWindow.end
之间间隔15分钟生成一系列时间戳,以便正确地对它们进行缓冲。谢谢。

根据定义,bucketing操作将把查询返回的每个对象放入一个bucket中,并且只放入一个bucket,即不能让它在一个查询中同时将同一个对象放入多个bucket中

如果我正确理解了您的问题,那么您需要应用a进行一系列查询,以获得每15分钟间隔内的问题数量。因此,对于您定义的每个时间间隔,您将获得该时间间隔内打开的问题:

{
    "query": {
        "filtered": { 
            "filter": {
                "bool": {
                    "must": [
                        "range": {
                            "timeWindow.start" : {
                                "lte" : "2015-10-14T17:00:00-07:00"
                            }
                        },
                        "range": {
                            "timeWindow.end" : {
                                "gte" : "2015-10-14T17:15:00-07:00"
                            }
                        },
                    ]
                }
            }
        }
    }
}
(您需要将
max_priority
聚合添加到查询中)


范围查询将由elasticsearch缓存,因此这应该是相当有效的。假设历史数据不变,您也可以在应用程序中缓存历史间隔的结果。

您需要为此使用脚本。创建一个发出日期数组的脚本。这些日期应从开始日期开始,每个日期应增加15分钟(假设间隔为15分钟)。现在将此脚本放在日期\直方图的脚本选项中。 因此,基本上脚本应该执行以下操作-

start=2015-10-14T17:00:00-07:00
end=2015-10-14T18:00:00-07:00"
Output of script = [ "2015-10-14T17:00:00-07:00" , "2015-10-14T17:15:00-07:00" , "2015-10-14T17:30:00-07:00" , "2015-10-14T17:45:00-07:00" ,  "2015-10-14T18:00:00-07:00" ] 

要更多地依赖于脚本,您可以通过以下步骤。这些博客可能也很有用,而且

好的,因为我的数据的时间戳总是被截断到最接近的10分钟,所以我想我可以使用
嵌套术语聚合来代替:

aggs: {
  per_start_time: {
    terms: {
      field: "timeWindow.start"
    },
    aggs: {
      per_end_time: {
        terms: {
          field: "timeWindow.end"
        },
        aggs: {
          max_priority: ${top_hits_aggregation}
        }
      }
    }
  }
}
这为我提供了一个嵌套的bucket per start_time per end_time,例如:

{
  "key": 1444867800000,
  "key_as_string": "2015-10-15T00:10:00.000Z",
  "doc_count": 11,
  "per_end_time": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [
      {
        "key": 1444871400000,
        "key_as_string": "2015-10-15T01:10:00.000Z",
        "doc_count": 11,
        "max_priority": {
          "hits": {
            "total": 11,
            "max_score": 4,
          }
        }
      }
    ]
  }
}
通过精简后端(ruby on rails)中的存储桶,我可以得到以下结果:

[
  {
    "start_time": "2015-10-14 14:40:00 -0700",
    "end_time": "2015-10-14 15:40:00 -0700",
    "max_priority": 4,
    "count": 12
  }
],
[
  {
    "start_time": "2015-10-14 14:50:00 -0700",
    "end_time": "2015-10-14 15:50:00 -0700",
    "max_priority": 4,
    "count": 12
  }
],
...

当然,除了elasticsearch之外,它还可以映射/简化为具有任意时间段的日期直方图。如果
timeWindow.start
timeWindow.end
和窗口持续时间在时间上完全是任意的,我想这相当于在后端获取所有内容并进行计数(因为它几乎为每个文档生成一个嵌套的时间段),幸运的是,我处理的时间戳在某种程度上是可预测的,因此我可以采用这种混合方法

谢谢你的回答,但问题是我需要在代码中动态生成所有可能的15分钟范围。我不知道我的数据的时间范围是什么。如果我需要查询持续时间,比如说1周,那么范围的数量是巨大的!我想知道是否还有其他解决方案。谢谢你的回答,你能给我指一些文档来说明动态字段生成是如何完成的吗?它是否适用于
date\u直方图
aggregation?我在答案中添加了一些指针,如果我有时间,我将尝试制作脚本。