2016-05-11 11 views
1

Ich bin neu bei ElasticSearch, es sieht fantastisch aus, aber ich brauche noch einige Paradigmenwechsel, um zu verstehen, wie man damit arbeitet.elasticsearch aggregate by multiple fields

Mein Projekt ist eine Umfrage-Plattform mit einem Dashboard. Eine Umfrage hat mehrere "Bildschirme" (Fragen) und jeder Bildschirm hat mehrere mögliche Antworten - ein Benutzer wählt einen aus und wenn er mit der Umfrage fertig ist, reicht er es ein.

Lassen Sie uns sagen, dass ich ein Dokument haben, die wie folgt aussieht (steht für eine Umfrage, dass ein Benutzer hat):

{ 
    "survey_station_id": "199", 
    "survey_id": "905", 
    "survey_unique_identifier": "2016-05-11 08:45:34-e4c080d90264e47a1fdb2d021ca52d3a", 
    "current_timestamp": 1462949134, 
    "survey_timestamp": "1462949115", 
    "answers": [{ 
     "screen_id": "9429", 
     "answer_id": "4" 
    }, { 
     "screen_id": "9428", 
     "answer_id": "3" 
    }, { 
     "screen_id": "9431", 
     "answer_id": "0", 
     "answer_text": "Very good" 
    }, { 
     "screen_id": "10819", 
     "answer_id": "10742" 
    }, { 
     "screen_id": "10820", 
     "answer_id": "0", 
     "answer_text": "[email protected]" 
    }, { 
     "screen_id": "10821", 
     "answer_id": "9" 
    }, { 
     "screen_id": "10822", 
     "answer_id": "5" 
    }, { 
     "screen_id": "10823", 
     "answer_id": "10745" 
    }] 
} 

ich Tonnen von Dokumenten wie dieses in meinem DB (oder Index).

In meinem Armaturenbrett, ich möchte eine Aufschlüsselung nach den Bildschirm zu übertragen und die Anzahl der jede Antwort, etwas zu zählen, die diese mir sagen wird:

{ 
    screen_id: 9429, 
    answers: [{ 
     answer_id: 1, 
     doc_count: 150 
    }, { 
     answer_id: 2, 
     doc_count: 23 
    }], 
    screen_id: 9428, 
    answers: [{ 
     answer_id: 1, 
     doc_count: 78 
    }, { 
     answer_id: 2, 
     doc_count: 96 
    }] 
} 

Wie kann ich das oder ähnliches erreichen? Ist es möglich und einfach mit meiner Dokumentenstruktur oder sollte ich einige Manipulationen daran vornehmen, um die Effizienz einer solchen Anforderung zu verbessern?

Vielen Dank im Voraus

+1

Meiner Meinung nach ist die beste Art, diese Daten darzustellen, ein Dokument pro Bildschirm/Antwort einschließlich der Umfrage-ID, Zeitstempel usw. '{" screen_id ":" 10832 "," answer_id ":" 10745 "," survey_id " : "905", "survey_timestamp": 1462949134, ...} '. Es wird viel einfacher sein, die Daten danach zu schneiden und zu würfeln. – Val

+0

Danke für die Eingabe, ich werde darüber nachdenken (Es ist wirklich eine gute Idee), aber im Allgemeinen, wenn ich eine solche Anforderung mit meiner bestehenden Struktur erreichen will, ist es möglich? – ThaiKov

+1

Sie können möglicherweise erreichen, was Sie wollen, aber Sie müssen sicherstellen, dass "Antworten" vom Typ "verschachtelt" in Ihrem Mapping ist. – Val

Antwort

0

Beachten Sie, dass Kibana (im Moment) nicht verschachtelte Dokumente nicht unterstützt, aber wenn Sie Ihr eigenes Armaturenbrett bauen dann ziehe ich verschachtelt Lösung voll „flat“ ein. Zum Beispiel wird es einfacher, Statistiken nur für das Stammdokument zu berechnen und Bildschirme bei Bedarf zu ignorieren.

Sobald Sie Teildokumente indiziert als "verschachtelte" haben müssen Sie diese Elemente in Ihrer Aggregationsanfrage haben:

  1. Nested aggregation
  2. Terms aggregation auf screen_id
  3. Eine andere Begriffe Aggregation auf answer_id

Achten Sie darauf, einige vernünftige Grenzen für Aggregationen von Begriffen festzulegen, da Sie sonst wahrscheinlich aufstoßen. Beachten Sie auch, dass Sie Regeln zur Aggregation von Termen "einschließen" und "ausschließen" können, wenn Sie nur an einigen der Bildschirme interessiert sind. Eigentlich stelle ich mir vor, dass Sie einen Filter auf survey_id haben möchten, da es nicht sinnvoll ist, Ergebnisse über verschiedene Umfragen zu aggregieren (es sei denn, screen_id s sind eindeutig).

+0

Danke für die Antwort, der Kommentar von @Val hat den Trick für mich gemacht, ich habe die entsprechenden Teile der Dokumentation gelesen und es geschafft diese Lösung.Trotzdem werde ich Ihre Antwort für zukünftige Besucher akzeptieren. Vielen Dank! – ThaiKov

+0

Danke, es gibt immer Kompromisse und Annahmen über zukünftige Abfragen, wenn Sie das Schema entscheiden :) Zum Beispiel auf flachen Schema ist es schwierig, die Anzahl der durchgeführten Umfragen/Tag zu berechnen. Oh, eigentlich ist es nicht, Sie können die Kardinalität von survey_unique_identifier berechnen, es dauert nur ein bisschen mehr Aufwand von ES und Zahlen sind nicht 100% genau, aber sehr nahe. – NikoNyrh