ElasticSearch - Verschachtelte Aggregation filtern

9

Ich habe ein Problem mit der Aggregation von Ergebnissen nach dem Filtern. Ich denke, ich bin auf dem richtigen Weg, aber ich fühle mich, als würde ich meinen Schwanz jagen.

So sieht es aus:

%Vor%

Also, mein Dokument sieht so aus:

%Vor%

Wenn ich jetzt einige Daten indexiere, zum Beispiel:

%Vor%

Ich möchte die Anzahl derjenigen erhalten, die nach (einschließlich) 2014-11-02 INSTALLIERT wurden und nicht deinstalliert haben (also war UNINSTALL vor dem 2014-11-02 oder es gibt kein UNINSTALL-Ereignis) und um sie zu gruppieren date_histogram Bedeutung (Bucket mit "date" - & gt; "count" -Daten).

Ich habe es geschafft, Filter für diese verschachtelten Daten zu schreiben, damit ich dieses gefilterte Ergebnis bekommen kann, aber ich jage meinen Schwanz weiter, wenn es um diese Histogramm-Aggregation geht.

Hier bin ich geblieben.

%Vor%

Und mein Ergebnis sieht so aus:

%Vor%

Und ich wollte etwas wie:

%Vor%

Grundsätzlich werden 4 Dokumente, die den Kriterien entsprechen, nach Datum sortiert, an dem diese Kriterien auftraten, 2 Dokumente am "2011-11-03" und zwei Dokumente am "2014-11-05" (4 Dokumente, bei denen das Ereignis "installieren" nach ist) 2014-11-02 und danach nicht deinstalliert (sie sind noch installiert).

    
tomdzon 04.11.2014, 09:58
quelle

1 Antwort

1

Dies ist eine teilweise Antwort.

Es gibt ein Hauptproblem: Laut Ihren Daten gibt es KEIN Dokument, das Ihren Anforderungen entspricht, also habe ich einige hinzugefügt:

%Vor%

Um die Logik anwenden zu können, habe ich das Schema so geändert, dass die Ereignisse auch im Elternteil enthalten sind - auf diese Weise können Sie nach "keine UNINSTALL-Ereignisse suchen" suchen. Da bei einer verschachtelten Suche immer nur EIN einzelnes Ereignis betrachtet wird, können Sie keine "berichtsweiten" Suchen durchführen.

%Vor%

Und jetzt zur Abfrage selbst. Es scheint, dass Sie bei Verwendung eines geschachtelten Filters nicht direkt zum "Filter" gehen können. Sie müssen zuerst die "Abfrage & gt; gefiltert & gt; Filter" -Ding.

Ein Tipp zum Schreiben langer elasticsearch-Abfragen im Allgemeinen - denken Sie daran, dass Sie "and" und "or" -Operatoren neben "must" und "must_not" haben - ist es einfach Code-ähnlich zu schreiben. In Ihrem Fall:

%Vor%

Oder:

%Vor%

Ich konnte alle bis auf die letzte has_only / has_none anwenden. Vielleicht möchten Sie versuchen, untergeordnete Dokumente zu verwenden. Dort können Sie zumindest den has_child-Filter unter einem must_not bool verwenden.

Die aktuelle Abfrage:

%Vor%     
whythecode 09.09.2015 10:12
quelle