我有一个包含对象eventvalue-eventtime的索引。我想编写一个查询,它将根据最近30秒的eventvalue返回聚合事件计数。此外,如果在给定的秒数内没有事件,我需要空桶 - 我需要在图表上显示这些数据。
所以我写了以下查询:
{
"query" : {
"bool" : {
"must" : [
{
"range" : {
"eventtime" : {
"gte" : "now-30s/s",
"lte" : "now/s",
"format" : "yyyy-MM-dd HH:mm:ss",
"time_zone": "+03:00"
}
}
},
{
"range" : {
"eventvalue" : {
"lte" : 3
}
}
}
]
}
},
"aggs": {
"values_agg": {
"terms": {
"field": "eventvalue",
"min_doc_count" : 0,
"order": {
"_term": "asc"
}
},
"aggs": {
"events_over_time" : {
"date_histogram" : {
"field" : "eventtime",
"interval" : "1s",
"min_doc_count" : 0,
"extended_bounds" : {
"min" : "now-30s/s",
"max" : "now/s"
},
"format" : "yyyy-MM-dd HH:mm:ss",
"time_zone": "+03:00"
}
}
}
}
}
}
此查询无法正常运行,我不知道原因。具体来说,第一个"范围"查询给了我想要的间隔(如果我删除它我从有史以来得到的值)。但第二个"范围"查询似乎没有任何效果。事件值可以是1到10之间的任何值,并且期望的效果是我将为事件值1-3提供三个桶。但是,我获得了所有10个桶的所有事件。
如何修复此查询,使其仍然返回空桶,但仅针对选定的偶数值?
答案 0 :(得分:1)
我认为您需要从"min_doc_count": 0
聚合中删除terms
。要实现您所瞄准的空桶,您只需在min_doc_count
聚合中使用date_histogram
。
根据documentation条款聚合:
设置min_doc_count = 0也会返回没有的条件的桶 匹配任何一击。
这解释了为什么您看到 eventvalue 的存储区大于3的存储区。它们被查询过滤掉了,但是被聚合术语带回来。
<强>更新强>
由于 eventvalues 可能不存在于30秒时间片中的任何位置,我建议的另一种方法是使用{手动指定要用作桶的离散值{1}}聚合。请参阅documentation here。
尝试将此用于您的聚合:
filters