2016-07-23 5 views
0

Wenn ich ein Schema wie definieren:elasticsearch: Wie gruppiere ich ein Feld und addiere die Gesamtsummen?

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

Und 1000 ist die Verkaufsunterlagen hinzufügen mit Daten wie 0 für männlich, 1 weiblich ES ist dow 1 für Montag, 2 für tues usw.

Wie erhalte ich ein Ergebnis wie:

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

oder

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 

und

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 

Antwort

1

Jede dieser ziemlich geradlinig ist, aber Sie sind wirklich ein paar verschiedene Fragen zu stellen.

Es ist nicht notwendig, jeden Wert explizit aufzurufen, wie Sie es getan haben (obwohl nichts technisch falsch ist). Stattdessen können Sie "einfachere" Fragen stellen und den Abfragebereich steuern, was Sie überhaupt sehen.

Geschlecht 0: durchschnittliche Höhe des Umsatzes Geschlecht 1: durchschnittliche Höhe des Umsatzes

Dies ist eine einfachere Frage werden kann:

Geschlecht N: durchschnittliche Höhe des Umsatzes

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

dow Montag: durchschnittliche Höhe des Umsatzes dow tues: durchschnittliche Höhe des Umsatzes dow vermählen: durchschnittliche Höhe des Umsatzes dow thurs: durchschnittliche Höhe des Umsatzes dow Freitag: durchschnittliche Höhe des Umsatzes

Dies kann sich eine einfachere Frage:

dow N, außer Samstag und sonntag: durchschnittliche Höhe des Umsatzes

Unter der Annahme, dow == 0 Sonntag und dow == 6 ist Samstag:

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

schließlich einfach die letzte weiteren Filter auf diese Frage fügt hinzu:

UND Alter 18-24 UND weiblich

Ich nehme an, dass die AND female für alle von ihnen kopiert werden sollte, weil so beantwortet wurde:

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

Sie haben bereits die stats Aggregation entdeckt, aber Sie fragen nur nach dem Durchschnitt, so dass die Verwendung der spezifischeren avg Aggregation keine Zeit mit der Durchführung von Berechnungen verschwendet, die Ihnen egal sind.

Sie werden auch über die Unterschiede zwischen den query context and the filter context lesen wollen zu verstehen, warum ich filter statt must oben verwendet (im Grunde, Filter zwischengespeichert werden kann und sie punkten nicht, sie „ja oder nein“ Fragen nur beantworten , was du hier willst).

+0

danke! das ist toll! Dies ist, was ich mache BTW http://i.imgur.com/1C0Klb8.png –

+0

Ordentlich. Stellen Sie sicher, dass Sie Kibana nicht unnötigerweise neu implementieren! – pickypg

+0

oh wow danke pickypg Ich habe gerade Kibana installiert und es ist erstaunlich. Dies ist eine großartige SO-Erfahrung. Ich frage mich, warum meine ursprüngliche Frage abgelehnt wurde. Ich fühlte ein RTFM-Gefühl von dieser Abstimmungsabstimmung, aber ich tat es (lies das Handbuch) und hatte immer noch eine Frage. Ich denke, SO sollte SO so funktionieren. Enthülle dich selbst und erkläre! :) –

0

Ich denke, das funktioniert:

"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"}}}}} 
Verwandte Themen