Ich habe eine Eltern / Kind-Struktur in 3 Ebenen. Sagen wir:
Firma -> Mitarbeiter -> Verfügbarkeit
Da die Verfügbarkeit (und auch der Mitarbeiter) hier häufig aktualisiert wird, wähle ich die Verwendung der Eltern / Kind-Struktur für verschachtelte. Und die Suchfunktion funktioniert einwandfrei (alle Dokumente in korrekten Shards).
Jetzt möchte ich diese Ergebnisse sortieren. Das Sortieren nach Metadaten des Unternehmens (1. Ebene) ist einfach. Ich muss aber auch nach 3. Stufe sortieren (Verfügbarkeit).
Ich möchte eine Liste von Unternehmen, die sortiert sind nach:
- Entfernung vom Standort bei angegebenem ASC
- Bewertung DESC
- Bald Verfügbarkeit ASC
Zum Beispiel:
Unternehmen A ist 5 Meilen entfernt, hat die Bewertung 4 und sobald einer seiner Mitarbeiter in 20 Stunden verfügbar ist, ist Unternehmen B ebenfalls 5 Meilen entfernt, hat ebenfalls die Bewertung 4, aber bald ist einer seiner Mitarbeiter in 5 Stunden verfügbar.
Daher muss das Sortierergebnis B, A sein.
Ich möchte jedem dieser Daten ein besonderes Gewicht hinzufügen, daher habe ich begonnen, Aggregationen zu schreiben, die ich später in meinem custom_score-Skript verwenden kann.
Vollständiger Inhalt zum Erstellen von Indizes, Importieren von Daten und Suchen
Jetzt habe ich es geschafft, eine Abfrage zu schreiben, die tatsächlich das Ergebnis zurückgibt, aber der Bucket für die Verfügbarkeitsaggregation ist leer. Allerdings bekomme ich auch Ergebnisse zu strukturiert zurück, ich möchte sie abflachen.
Derzeit bekomme ich zurück:
Firmen-IDS -> Mitarbeiter-IDS -> Erstverfügbarkeit
Ich hätte gerne eine Aggregation wie:
Firmen-IDS -> erste Verfügbarkeit
Auf diese Weise kann ich mein custom_score
Skript erstellen, um die Punktzahl zu berechnen und sie richtig zu sortieren.
Vereinfachte Frage:
Wie kann man nach mehrstufigen (Enkel-) Kindern sortieren / aggregieren und möglicherweise das Ergebnis reduzieren?
quelle
Query Failed [Failed to execute main query]]; nested: NullPointerException;
. Können Sie Ihren Kern in Ihrer lokalen Umgebung ausführen und sicherstellen, dass er in Ordnung ist? Vielen Dank!Antworten:
Dazu benötigen Sie keine Aggregationen:
Dies sind die Sortierkriterien:
Wenn Sie # 3 ignorieren, können Sie eine relativ einfache Unternehmensabfrage wie folgt ausführen :
# 3 ist schwierig, da Sie die Verfügbarkeit ( Unternehmen> Mitarbeiter> Verfügbarkeit ) für jedes Unternehmen ermitteln müssen, das dem Zeitpunkt der Anforderung am nächsten liegt, und diese Dauer als drittes Sortierkriterium verwenden müssen.
Wir werden eine
function_score
Abfrage auf Enkelkind-Ebene verwenden, um den Zeitunterschied zwischen der Anforderungszeit und jeder Verfügbarkeit im Treffer zu ermitteln_score
. (Dann verwenden wir das_score
als drittes Sortierkriterium).Um die Enkelkinder zu erreichen, müssen wir eine
has_child
Abfrage innerhalb einerhas_child
Abfrage verwenden.Für jedes Unternehmen möchten wir den schnellstmöglichen verfügbaren Mitarbeiter (und natürlich dessen engste Verfügbarkeit). Elasticsearch 2.0 gibt uns einen
"score_mode": "min"
Fall für solche Fälle, aber da wir uns darauf beschränken, werden"score_mode": "max"
wir das Enkelkind_score
zum Kehrwert des Zeitunterschieds machen.Nun ist die
_score
für jedes Enkelkind ( Verfügbarkeit )1 / number-of-hours-until-available
(damit wir die maximale wechselseitige Zeit bis zur Verfügbarkeit pro Mitarbeiter und die maximale wechselseitige (ly?) Verfügbare Mitarbeiterzahl pro Unternehmen verwenden können).Alles in allem fragen wir weiterhin Unternehmen ab , verwenden jedoch Unternehmen> Mitarbeiter> Verfügbarkeit , um das
_score
zu verwendende Sortierkriterium Nr. 3 zu generieren :quelle
_score
von der Zeit bis zur Verfügbarkeit generiert wird .Sie sollten die R-Tree-Datenstruktur https://en.wikipedia.org/wiki/R-tree überprüfen .
quelle