我的弹性搜索服务器包含以下字段:timestamp
,user
和bytes_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
}
};
由于 戴尔
答案 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"
}
}