2014-02-22 218 views
2

是否可以在彈性搜索中定義聚合函數?ElasticSearch聚合函數

E.g.數據:

author weekday status 
me  monday ok 
me  tuesday ok 
me  moday bad 

我想根據作者和平日得到聚集,並作爲一種價值我想狀態字段的串聯:

agg1 agg2 value 
me monday ok,bad 
me tuesday ok 

我知道你能做的數量,而且可以定義另一個用於聚合的函數嗎?編輯/回答:看起來ES中沒有多行聚合支持,因此我們不得不在最後一個字段使用subaggregation(參見Akshay的示例)。如果你需要更復雜的聚合函數,然後按ID聚合(注意,你將無法使用_id,所以你必須在其他領域複製它) - 這樣你就可以進行高級彙總每個存儲桶中的單個項目。

+1

一個方面應該是能夠做到這一點 – phoet

回答

2

通過使用1.0中的sub aggregations可以大致獲得想要的結果。假設文檔結構作者,平日和狀態,你可以使用下面的聚合:

{ 
    "size": 0, 
    "aggs": { 
    "author": { 
     "terms": { 
     "field": "author" 
     }, 
     "aggs": { 
     "days": { 
      "terms": { 
      "field": "weekday" 
      }, 
      "aggs": { 
      "status": { 
       "terms": { 
       "field": "status" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

它給你以下結果:

{ 
    ... 
    "aggregations": { 
     "author": { 
     "buckets": [ 
      { 
       "key": "me", 
       "doc_count": 3, 
       "days": { 
        "buckets": [ 
        { 
         "key": "monday", 
         "doc_count": 2, 
         "status": { 
          "buckets": [ 
           { 
           "key": "bad", 
           "doc_count": 1 
           }, 
           { 
           "key": "ok", 
           "doc_count": 1 
           } 
          ] 
         } 
        }, 
        { 
         "key": "tuesday", 
         "doc_count": 1, 
         "status": { 
          "buckets": [ 
           { 
           "key": "ok", 
           "doc_count": 1 
           } 
          ] 
         } 
        } 
        ] 
       } 
      } 
     ] 
     } 
    } 
} 
+0

呀,這幾乎是我所做的。該解決方案仍然需要處理客戶端的最後一部分桶。 –