2012-03-02 12 views
7

Powiedzmy mam następujące odwzorowanie:Czy można sortować zagnieżdżone dokumenty w ElasticSearch?

"site": { 
    "properties": { 
    "title":  { "type": "string" }, 
    "description": { "type": "string" }, 
    "category": { "type": "string" }, 
    "tags":  { "type": "array" }, 
    "point":  { "type": "geo_point" } 
    "localities": { 
     type: 'nested', 
     properties: { 
     "title":  { "type": "string" }, 
     "description": { "type": "string" }, 
     "point":  { "type": "geo_point" } 
     } 
    } 
    } 
} 

ja wtedy robi „_geo_distance” sortuje dokumentu nadrzędnego i jestem w stanie uporządkować dokumenty na „site.point”. Jednak chciałbym również, aby zagnieżdżone miejsca zostały posortowane według "_geo_distance" wewnątrz dokumentu nadrzędnego.

Czy to możliwe? Jeśli tak to jak?

Odpowiedz

9

Niestety, nie (przynajmniej jeszcze nie).

Zapytanie w ElasticSearch identyfikuje tylko te dokumenty, które pasują do zapytania i ich dopasowanie.

Aby zrozumieć, co zagnieżdżone dokumenty są użyteczne, należy rozważyć następujący przykład:

{ 
    "title": "My post", 
    "body":  "Text in my body...", 
    "followers": [ 
     { 
      "name":  "Joe", 
      "status": "active" 
     }, 
     { 
      "name":  "Mary", 
      "status": "pending" 
     }, 
    ] 
}   

Powyższy JSON, raz indeksowane w ES, jest funkcjonalnym odpowiednikiem poniżej. Zauważ, że pole followers została spłaszczona:

{ 
    "title":   "My post", 
    "body":    "Text in my body...", 
    "followers.name": ["Joe","Mary"], 
    "followers.status": ["active","pending"] 
}   

Poszukiwanie: followers with status == active and name == Mary pasowałby ten dokument ... nieprawidłowo.

Zagnieżdżone pola pozwalają nam obejść to ograniczenie. Jeśli pole followers jest zadeklarowane jako typ nested zamiast typu object, wówczas jego zawartość jest wewnętrznie tworzona jako oddzielny (niewidoczny) dokument podrzędny. Oznacza to, że możemy użyć parametru nested query lub nested filter do wysyłania zapytań do zagnieżdżonych dokumentów jako indywidualnych dokumentów.

Jednak dane wyjściowe z zagnieżdżonych klauzul query/filter informują nas tylko o tym, czy główny dokument jest zgodny i jak dobrze pasuje. Nie informuje nas nawet, które z zagnieżdżonych dokumentów są zgodne. Aby to zrozumieć, musielibyśmy napisać kod w naszej aplikacji, aby sprawdzić każdy z zagnieżdżonych dokumentów zgodnie z naszymi kryteriami wyszukiwania.

Istnieje kilka żądań dodania tych funkcji, ale nie jest to łatwy problem do rozwiązania.

Jedynym sposobem na osiągnięcie tego, co chcesz, jest zindeksowanie pod-dokumentów jako oddzielnych dokumentów oraz ich samodzielne sortowanie i sortowanie. Przydatne może być ustanowienie relacji rodzic-dziecko między głównym dokumentem a oddzielnymi pod-dokumentami. (Patrz parent-type mapping sekcja nadrzędna & dzieckiem index api docs, a top-children i has-child zapytań.

Ponadto, użytkownik ES zostały wysłane listy o nowym has_parent filter że są one aktualnie pracuje w fork. Jednak ta nie jest jeszcze dostępny w głównym repozytorium ES.

+0

Dziękuję za wspaniałą odpowiedź! – Yeggeps

+0

Ok, więc trochę z tym grałem Nie ma sposobu na przeszukiwanie miejsc nadrzędnych miejscowości, tak jak ja to widzę? następnie należy uwzględnić pole nadrzędne, które musi być możliwe do przeszukiwania dla każdego dziecka, prawda? – Yeggeps

+0

Poprawnie Nie można robić złączeń Każdy dokument jest oceniany na podstawie własnego m erits. Rodzic/dziecko i zagnieżdżone zapytania podwajają pracę, ponieważ najpierw uruchamiają zapytanie na (np) dzieciach, a następnie używają tych wartości do uruchomienia zapytania przeciw rodzicom. – DrTech

Powiązane problemy