Mam strukturę rodzica / dziecka na 3 poziomach. Powiedzmy:
Firma -> Pracownik -> Dostępność
Ponieważ dostępność (a także pracownik) jest tutaj często aktualizowana, wybieram użycie struktury nadrzędnej / podrzędnej zamiast zagnieżdżonej. Funkcja wyszukiwania działa dobrze (wszystkie dokumenty we właściwych fragmentach).
Teraz chcę posortować te wyniki. Sortowanie ich według metadanych z firmy (poziom 1) jest łatwe. Ale muszę też sortować według poziomu trzeciego (dostępność).
Chcę listę firm posortowanych według:
- Odległość od lokalizacji podanej ASC
- Ocena DESC
- Najszybsza dostępność ASC
Na przykład:
Firma A jest oddalona o 5 mil, ma ocenę 4 i najwcześniej jeden z jej pracowników jest dostępny za 20 godzin. Firma B jest również oddalona o 5 mil, również ma ocenę 4, ale najwcześniej jeden z jej pracowników jest dostępny za 5 godzin.
Dlatego wynik sortowania musi być B, A.
Chciałbym dodać specjalną wagę do każdej z tych danych, więc zacząłem pisać agregacje, które będę mógł później wykorzystać w moim skrypcie custom_score.
Pełny sens tworzenia indeksu, importowania danych i wyszukiwania
Teraz udało mi się napisać zapytanie, które faktycznie zwraca wynik, ale zasobnik agregacji dostępności jest pusty. Jednak wyniki są zbyt ustrukturyzowane, chciałbym je spłaszczyć.
Obecnie wracam:
IDS firmy -> IDS pracowników -> pierwsza dostępność
Chciałbym mieć agregację taką jak:
IDS firmy -> pierwsza dostępność
W ten sposób mogę zrobić swoje custom_score
skrypt, aby obliczyć wynik i odpowiednio je posortować.
Bardziej uproszczone pytanie: w
jaki sposób można sortować / agregować według wielopoziomowych (wielkich) elementów potomnych i ewentualnie spłaszczyć wynik.
źródło
Query Failed [Failed to execute main query]]; nested: NullPointerException;
. Czy potrafisz przeprowadzić sedno w swoim lokalnym środowisku i upewnić się, że wszystko jest w porządku? Dzięki!Odpowiedzi:
Nie potrzebujesz do tego agregacji:
Oto kryteria sortowania:
Jeśli zignorujesz # 3, możesz uruchomić stosunkowo proste zapytanie firmowe, takie jak:
Punkt 3 jest trudny, ponieważ musisz sięgnąć w dół i znaleźć dostępność ( firma> pracownik> dostępność ) dla każdej firmy najbliższej godzinie złożenia wniosku i użyć tego czasu jako trzeciego kryterium sortowania.
Użyjemy
function_score
zapytania na poziomie wnuka, aby zmierzyć różnicę czasu między czasem żądania a każdą dostępnością w działaniu_score
. (Wtedy użyjemy_score
trzeciego kryterium sortowania).Aby dotrzeć do wnuków, musimy użyć
has_child
zapytania wewnątrzhas_child
zapytania.Dla każdej firmy zależy nam na jak najszybszym dostępnym Pracowniku (i oczywiście najbliższej Dostępności). Elasticsearch 2.0 da nam takie
"score_mode": "min"
przypadki, ale na razie, ponieważ jesteśmy ograniczeni,"score_mode": "max"
sprawimy, że wnuk_score
będzie odwrotnością różnicy czasu.Tak więc teraz
_score
dla każdego wnuka ( Dostępność ) będzie1 / number-of-hours-until-available
(tak, abyśmy mogli wykorzystać maksymalny wzajemny czas, aż będzie dostępny dla pracownika, oraz maksymalny wzajemny (?) Dostępny pracownik na firmę).Kładzenie to wszystko razem, nadal zapytań firmy ale korzystają firmy> Pracownik> availabilty do generowania
_score
użyć jako # 3 kryterium sortowania:źródło
_score
od czasu do momentu, gdy będzie dostępny .Powinieneś sprawdzić strukturę danych R-Tree https://en.wikipedia.org/wiki/R-tree .
źródło