ElasticSearch extended_bounds最小值最大值

问题描述:

即时通讯使用elasticsearch aggregations返回两个不同的集合组,一个用于当前一周和前一周,我现在每周汇总如下:ElasticSearch extended_bounds最小值最大值

"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很陌生,也许我在这里错过了一些明显的东西,请原谅我缺乏知识。

按照documentation

注意(如名称暗示)extended_bounds不过滤桶。也就是说,如果extended_bounds.min高于从文档中提取的值,那么文档仍然会规定第一个存储段将是什么(对于extended_bounds.max和最后一个存储段也是如此)。为了过滤桶,您应该将直方图聚合嵌套在范围过滤器聚合中,并使用适当的从/到设置。

例子:

{ 
    "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过滤)。

+0

谢谢,我一定会考虑将它们嵌套在一个过滤器中,现在我在两个查询中运行两个查询,可能不是最有效的方法... – bmaggi 2014-11-02 22:35:03