elasticsearch中的范围查询无法正常工作

时间:2016-01-22 13:12:09

标签: elasticsearch

我有一个包含对象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个桶的所有事件。

如何修复此查询,使其仍然返回空桶,但仅针对选定的偶数值?

1 个答案:

答案 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