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
{
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?我在答案中添加了一些指针,如果我有时间,我将尝试制作脚本。