我使用elasticsearch aggregations
返回两个不同的聚合组,一个用于当前周,一个用于前一周,我当前的周聚合看起来像这样:
"aggregations": { "current": { "date_histogram": { "field": "date", "interval": "1d", "min_doc_count": 0, "extended_bounds": { "min": new Date().setDate(new Date().getDate() - 7), "max": new Date().getDate() } } } }
在这一点上一切都很好,即时使用min_doc_count
,extended_bounds
以填补空桶的空隙,以防万一.
在我的其他聚合上,我几乎以同样的方式重复这个过程,但我希望我的桶能够用于前一个时期!
我知道这extended_bounds
不是过滤桶,因此我想在我的聚合上添加一个过滤器,如下所示:
"aggregations": { filtered: { "filter" : { "bool": { "must": [{ "range" : { date: { from: new Date().setDate(new Date().getDate() - 14), to: new Date().setDate(new Date().getDate() - 7) } } }] } }, }, "previous": { "date_histogram": { "field": "date", "interval": "1d", "min_doc_count": 0, "extended_bounds": { "min": new Date().setDate(new Date().getDate() - 14), "max": new Date().setDate(new Date().getDate() - 7) } } } }
第二个聚合应该回溯到时间,恰好是14天,直到7天前.我知道min
工作,但max
不是,返回的桶直到今天,即使我使用过滤器来限制范围,我must
在这里使用,但似乎没有做任何事情.我对ES很新,也许我错过了一些明显的东西,原谅我缺乏知识.
根据文件:
请注意(如名称所示)extended_bounds不会过滤存储桶.这意味着,如果extended_bounds.min高于从文档中提取的值,则文档仍将指示第一个存储桶的内容(对于extended_bounds.max和最后一个存储桶也是如此).对于过滤存储桶,应该使用适当的from/to设置将直方图聚合嵌套在范围过滤器聚合下.
例:
{ "query" : { "filtered" : { "filter": { "range" : { "price" : { "to" : "500" } } } } }, "aggs" : { "prices" : { "histogram" : { "field" : "price", "interval" : 50, "min_doc_count" : 0, "extended_bounds" : { "min" : 0, "max" : 500 } } } } }
简而言之:使用查询过滤器,或将直方图聚合嵌套在过滤器聚合中.在您的示例中,您不是嵌套聚合,而是并排使用它们(因此直方图agg不会被filter-agg过滤).