2015-04-27 18 views
5

Buduję aplikację ze skomplikowanym modelem, mówi Book, User and Review.Elasticsearch z wieloma relacjami rodzic/dziecko

Recenzja zawiera zarówno książkę, jak i identyfikator użytkownika. Aby móc wyszukiwać książki, które zawierają co najmniej jedną recenzję, ustawiłem opcję nadrzędną Książka jako Recenzja i stosuję ruting jako taki. Muszę jednak znaleźć użytkowników, którzy napisali recenzje zawierające określone frazy.

Czy możliwe jest posiadanie zarówno książki, jak i użytkownika jako rodzica przeglądu? Czy istnieje lepszy sposób radzenia sobie z taką sytuacją?

Należy zauważyć, że nie jestem w stanie zmienić sposobu modelowania danych/nie chcę tego robić, ponieważ dane są przenoszone do Elasticsearch z bazy danych trwałości.

Odpowiedz

5

Z tego co wiem, nie możesz mieć dokumentu z dwoma rodzicami.

Moja sugestia na podstawie Application-side join chapter of Elasticsearch the definitive guide:

  • Tworzenie relacji rodzic/dziecko Book/Review
  • pamiętaj masz user_id nieruchomość w Review mapowania, które zawierają identyfikator użytkownika, który napisał, że test.

myślę, że obejmuje zarówno korzysta z przypadków opisanych w następujący sposób:

  • Books that contain at least one review Może być rozwiązany ma dziecku filter/query
  • Users who wrote reviews that contain certain phrases To może być rozwiązany poprzez odpytywanie na opinie ze zwrotem chcesz wyszukać i wykonać cardinality aggregation na polu user_id. Jeśli potrzebujesz informacji o użytkownikach, musisz wysłać zapytanie do bazy danych (lub innego indeksu elasticsearch) z pobranymi identyfikatorami.

Edit: "give me the books that have reviews this month written by user whose name started with John"

polecam Ci zebrać wszystkie te, których używa przypadki i denormalize dane potrzebne do ich osiągnięcia. W tym konkretnym przypadku wystarczy z denormalizowaniem nazwy użytkownika na Review. W każdym razie elasticsearch ludzi pisze o zarządzaniu relacjami in their blog lub elasticsearch the definitive guide

+0

Dzięki, jednak dane są stosunkowo duże, więc aplikacja po stronie przyłączenia jest co staram się uniknąć. Dzięki zaawansowanym zapytaniom takim jak: "daj mi książki, które mają recenzje w tym miesiącu napisane przez użytkownika, którego imię zaczynało się od Johna"?Czy łączenie po stronie aplikacji spowoduje pobranie wszystkich użytkowników, których nazwa zaczyna się od Jana i przekazywanie tych identyfikatorów w filtrze warunków? – tungd

+0

@tungd Ukończyłem odpowiedź i dodałem kilka referencji, które mogą Cię zainteresować. – moliware

+0

Już przeczytałem te artykuły. Jak wspomniano w pytaniu, nie mogę zmienić modeli danych. Przypuszczam, że przyłączenie po stronie aplikacji jest jedyną drogą. Patrzę również na funkcję "wyszukiwania" filtru "pojęć". Dzięki i tak. – tungd

0

Masz dwie opcje

Elasticsearch zagnieżdżonych

Elasticsearch rodzic & dziecko

oba są porównywane i oceniane ładnie here

0

Somths jak (tylko upewnij Książki wpisać jako rodzic dla użytkowników i recenzje rodzajów)

.../index/users/_search?pretty" -d ' 
    { 
     "query": { 
      "filtered": { 
       "filter": { 
        "and": [ 
         { 
          "has_parent": { 
           "parent_type": "books", 
           "filter": { 
            "has_child": { 
             "type": "Reviews", 
             "query": { 
              "term": { 
               "text_review": "some word" 
              } 
             } 
            } 
           } 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
    ' 
Powiązane problemy