Elasticsearch总和一个月内特定小时的总值

时间:2014-04-24 02:09:46

标签: elasticsearch

我的弹性搜索服务器包含以下字段:timestampuserbytes_down(以及其他)

我想将用户的bytes_down值总计为一个月但仅限于小时数在上午8点到晚上8点之间

我能够通过以下查询获取日期直方图的每日总数(我在这里使用perl API)但是无法找到将其减少到小时的方法每天的范围

my $query = {
index => 'cm',
    body  => {
        query => {
            filtered => {
                query => {
                    term => {user => $user}
                },
                filter => {
                    and => [
                    {
                        range => {
                            timestamp => {
                                gte => '2014-01-01',
                                lte => '2014-01-31'
                            }
                        }
                    },
                    {
                        bool => {
                            must => {
                                term => { zone => $zone }
                            }
                        }
                    }
                    ]
                }
            }
        },
        facets => {
            bytes_down => {
                date_histogram => {
                    field => 'timestamp',
                    interval => 'day',
                    value_field => 'downstream'
                }
            }
        },
        size => 0
    }
};

由于 戴尔

2 个答案:

答案 0 :(得分:0)

每小时添加一个bool必须范围过滤器,我不确定你是想要永远这样做还是在特定的一天,但Zachary Tong的这个幻灯片放映是一个了解你可能是什么的好方法做,尤其是一般的过滤器。 https://speakerdeck.com/polyfractal/elasticsearch-query-optimization?slide=28

答案 1 :(得分:0)

我认为您需要使用script过滤器而不是range过滤器,然后您需要将其放在方面的facet_filter部分中:

"facet_filter" => {
    "script" => {
        "script" => "doc['timestamp'].date.getHourOfDay() >= 8 &&
                     doc['timestamp'].date.getHourOfDay() < 20"
    }
}