我需要返回按术语划分的数据,然后使用elasticsearch_dsl
返回ElasticSearch的日期间隔。 间隔已参数化,我试图找出是否有办法强制ElasticSearch返回上一个完整间隔(基于日期范围)填充在零缺失的区间内。
我已在聚合中使用min_doc_count=0
和extended_bounds.min
,它负责范围的开始,但无法弄清楚如何指定extended_bounds.max
这样没有抓住最近的部分间隔。
这是我到目前为止的相关代码:
from_period = (datetime.now() - timedelta(days=lookback_in_days))
date_range_max = "now"
if interval in FULL_INTERVALS:
# round down by interval
date_range_max += "/" + (interval[:1].upper() if interval == 'month' else interval[:1])
else:
# round down by time unit
temp = re.split(PARTIAL_INTERVAL_PATTERN, interval)
## e.g. for interval = '3d', temp will have ['', '3', 'd', '']
date_range_max += "/" + temp[2]
s = ES_Search(doc_type='message', index=config['ES_INDEX_NAME']) \
.using(client) \
.query('match', foo=bar) \
.filter('range',
**{
"@timestamp": {
"gte": from_period,
"lt": date_range_max
}
}
)
for name in score_names:
s.aggs.bucket(name, 'terms', field='meta.{}.value.keyword'.format(name))
s.aggs[name].bucket(
'interval_buckets',
'date_histogram',
field='@timestamp', interval=interval,
format='YYYY-MM-dd', time_zone=time_zone,
# set a "hard" start/end dates to make sure uniform earliest/latest bucket, and include empty buckets
min_doc_count=0,
extended_bounds={
"min": from_period.strftime("%Y-%m-%d"),
"max": datetime.now().strftime("%Y-%m-%d")
}
)
有没有办法指定extended_bounds.max
以便Elasticsearch
根据filter
进行计算,或者我是否必须手动计算{{1}中使用的日期}}?
答案 0 :(得分:0)
看起来似乎无法避免手动计算。
我尝试使用单独的查询,这实际上有效,但让我意识到range
过滤的上限不适用于倍数的间隔(例如3d,2w等),因为你只能截断一个单位(例如/ d,/ w等)