2016-07-23 13 views
0

私は次のようにスキーマを定義する場合:elasticsearch:フィールドと合計の合計をグループ化するにはどうすればよいですか?

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

、男性のための0、女性のための1のようなデータでESへの販売伝票1000年代を追加し、ダウは月曜日のための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:

ジェンダーN:売上高の平均量

これは単純な質問になることができます: は男女1売上高の平均額売上高の平均量

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

ダウ月曜日:販売 ダウ火の平均額:売上 ダウ木の平均額:売上 結婚ダウ平均額売上高の平均量 ダウ金曜日:売上高の平均量

これはなることができます単純な質問:

ダウN、土曜日または日曜日を除く:売上高の平均量

日曜日dow == 0されると仮定し、dow == 6は土曜日です:

と年齢18-24と女性

:最後に、最後の1は、単にその質問に、別のフィルタを追加します

{ 
    "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" 
      } 
     } 
     } 
    } 
    } 
} 

私は 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アグリゲーションを使用しても、気にしない計算の実行に時間を費やすことはありません。

ます。また、私が代わりにmust(基本的に、フィルタは、彼らが得点していないをキャッシュすることができる上filterを使用理由を理解するためにquery context and the filter contextの違いについて読みたいだろう。彼らは唯一の答え「yesまたはno」の質問これはあなたがここで欲しいものです)。

+0

ありがとうございました!これは素晴らしい!これは私が行っているBTW http://i.imgur.com/1C0Klb8.png –

+0

ニート。不必要にKibanaを再実装していないことを確認してください。 – pickypg

+0

ああwow pickypgに感謝私はちょうどKibanaをインストールし、それは素晴らしいです。これは素晴らしいSOの経験です。私はなぜ私の元の質問が下投票を持っているのだろうか。私はRTFMがその下の投票から感じていると感じましたが、私は(マニュアルを読んで)行いましたが、まだ質問がありました。私はこれがちょうどどのように動作すべきかと思います。明らかに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"}}}}} 
関連する問題