弹性搜索日期直方图聚合 - 如何强制最大(最多重新)完整间隔

时间:2017-06-20 15:03:26

标签: elasticsearch elasticsearch-dsl

我需要返回按术语划分的数据,然后使用elasticsearch_dsl返回ElasticSearch的日期间隔。 间隔已参数化,我试图找出是否有办法强制ElasticSearch返回上一个完整间隔(基于日期范围)填充在零缺失的区间内。

我已在聚合中使用min_doc_count=0extended_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}中使用的日期}}?

1 个答案:

答案 0 :(得分:0)

看起来似乎无法避免手动计算。

我尝试使用单独的查询,这实际上有效,但让我意识到range过滤的上限不适用于倍数的间隔(例如3d,2w等),因为你只能截断一个单位(例如/ d,/ w等)