2016-07-23 36 views
0

如果我這樣定義一個模式:elasticsearch:我如何groupby一個字段和平均總計?

"mappings": { 
    "sales": { 
     "properties": { 
      "gender": { "type": "byte" }, 
      "age": { "type": "byte" }, 
      "amount": { "type": "integer" }, 
      "dow": { "type": "byte" }, 
      "day_of": { "type": "date" }, 
     } 
    } 
} 

並添加銷售單據的1000與像0男,1女數據ES,道瓊斯指數1日,2星期二,等

我如何獲得一個結果,如:

gender 0: average amount of sales 
gender 1: average amount of sales 

dow monday: average amount of sales 
dow tues: average amount of sales 
dow wed: average amount of sales 
dow thurs: average amount of sales 
dow friday: average amount of sales 

dow monday AND age 18-24: average amount of sales 
dow tues AND age 18-24 AND female: average amount of sales 
dow wed AND age 18-24: average amount of sales 
dow thurs AND age 18-24: average amount of sales 
dow friday AND age 18-24: average amount of sales 

回答

1

它們中的每一個是非常簡單的,但你真的問了幾個不同的問題。

沒有必要像你所做的那樣明確地調出每個值(儘管它沒有什麼技術上的錯誤)。相反,您可以詢問「更簡單」的問題,並允許查詢範圍控制您甚至看到的內容。

性別0:銷售的平均量 性別1:銷售的平均量

這可以成爲一個簡單的問題:

性別N:銷售的平均量

{ 
    "size": 0, 
    "aggs": { 
    "group_by_gender": { 
     "terms": { 
     "field": "gender" 
     }, 
     "aggs": { 
     "avg_sales": { 
      "avg" :{ 
      "field": "amount" 
      } 
     } 
     } 
    } 
    } 
} 

道瓊斯指數星期一:銷售 道瓊斯指數週二平均量: 道指週三銷售的平均金額:銷售 道指週四的平均量:銷售的平均量 道瓊斯指數週五:銷售的平均量

這可以成爲一個簡單的問題:

道瓊斯N,除週六或週日:銷售的平均量

假設dow == 0是星期天和dow == 6是星期六:

{ 
    "size": 0, 
    "query": { 
    "bool" : { 
     "must_not": [ 
     { 
      "terms": { 
      "dow": [0, 6] 
      } 
     } 
     ] 
    } 
    }, 
    "aggs": { 
    "group_by_dow": { 
     "terms": { 
     "field": "dow", 
     "size": 5 
     }, 
     "aggs": { 
     "avg_sales": { 
      "avg": { 
      "field": "amount" 
      } 
     } 
     } 
    } 
    } 
} 

最後,最後一隻是增加了一個過濾器,這個問題:

和18-24歲,女

我假設AND female是爲了複製所有的人,因爲這是你的回答:

{ 
    "size": 0, 
    "query": { 
    "bool" : { 
     "must_not": [ 
     { 
      "terms": { 
      "dow": [0, 6] 
      } 
     } 
     ], 
     "filter": [ 
     { 
      "term": { 
      "gender": 1 
      } 
     }, 
     { 
      "range": { 
      "age": { 
       "gte": 18, 
       "lte": 24 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "aggs": { 
    "group_by_dow": { 
     "terms": { 
     "field": "dow", 
     "size": 5 
     }, 
     "aggs": { 
     "avg_sales": { 
      "avg": { 
      "field": "amount" 
      } 
     } 
     } 
    } 
    } 
} 

您已經發現了stats彙總,但您只是要求平均值,因此使用更具體的avg彙總不會浪費時間執行您不關心的計算。

你也想閱讀有關query context and the filter context之間的差異理解爲什麼我用filter上面,而不是must(基本上,過濾器可以被緩存他們不進球,他們只回答「是或否」的問題,這就是你想要的)。

+0

謝謝!這很棒!這就是我正在做的BTW http://i.imgur.com/1C0Klb8.png –

+0

整潔。確保你不是不必要地重新實現Kibana! – pickypg

+0

哦哇謝謝你pickypg我剛安裝了Kibana,它很棒。這是一個很棒的SO體驗。我想知道爲什麼我原來的問題得到了投票。我從這次投票中感受到了RTFM的感覺,但我確實(閱讀了手冊),仍然有一個問題。我認爲這就是SO應該如何工作。顯示自己downvoter並解釋! :) –

0

我想這樣的作品:

"query": { 
     "bool": {   
      "must": [ 
       { "match": {"gender":1} }, 
       { "range": {"age": {"gte": 18, "lte": 24}} } 
      ] 
     } 
    }, 
"size": 0, 
"aggs":{"monday" :{"filter":{"term":{"dow":1}}, "aggs":{"s":{"stats":{"field": "amount"}}}}, 
     "tuesday":{"filter":{"term":{"dow":2}}, "aggs":{"s":{"stats":{"field": "amount"}}}}} 
相關問題