2014-11-01 1609 views
2

即時通訊使用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很陌生,也許我在這裏錯過了一些明顯的東西,請原諒我缺乏知識。

回答

5

按照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

相關問題