2015-04-27 11 views
5

Sto costruendo un'applicazione con un modello complicato, come ad esempio Book, User e Review.Elasticsearch con più relazioni padre/figlio

Una revisione contiene sia l'ID libro che l'ID utente. Per poter cercare Libri che contengono almeno una recensione, ho impostato il libro come genitore della recensione e ho il routing come tale. Tuttavia, ho anche bisogno di trovare utenti che hanno scritto recensioni contenenti determinate frasi.

È possibile avere sia il libro che l'utente come genitore della recensione? C'è un modo migliore per gestire tale situazione?

Nota che non sono in grado di modificare il modo in cui i dati sono modellati/non disposti a farlo in quanto i dati vengono trasferiti a Elasticsearch da un database di persistenza.

risposta

5

Per quanto ne so non è possibile avere un documento con due genitori.

mio suggerimento sulla base di Application-side join chapter of Elasticsearch the definitive guide:

  • Creare una relazione padre/figlio Book/Review
  • essere sicuri di avere user_id proprietà in Review mappatura che contengono l'ID utente che ha scritto quella recensione.

Penso che copre entrambi gli usi dei casi è descritto come segue:

  • Books that contain at least one review Si può essere risolto con ha bambino filter/query
  • Users who wrote reviews that contain certain phrases Si può essere risolto tramite una query al opinioni con la frase si desidera cercare ed eseguire un cardinality aggregation nel campo user_id. Se hai bisogno di informazioni sugli utenti devi interrogare il tuo database (o un altro indice elasticsearch) con gli ID recuperati.

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

vi consiglio di raccogliere i casi tutti coloro avanzato utilizza e denormalizzare i dati necessari per la loro realizzazione. In questo caso particolare è sufficiente denormalizzare il nome utente in Review. Nelle persone ogni caso elasticsearch ha scritto di gestione dei rapporti in their blog o elasticsearch the definitive guide

+0

Grazie, tuttavia i dati sono relativamente grandi, in modo da applicazioni lato join è quello che sto cercando di evitare. Con query avanzate come: "dammi i libri che hanno recensioni questo mese scritte dall'utente il cui nome è iniziato con John"?Fare un join sul lato dell'applicazione porterebbe a recuperare tutti gli utenti il ​​cui nome iniziava con John e passava quegli id ​​in un filtro termini? – tungd

+0

@ tungd Ho completato la mia risposta e aggiunto un paio di riferimenti che potresti trovare interessanti – moliware

+0

Ho già letto quegli articoli. Come indicato nella domanda, non sono in grado di modificare i modelli di dati. Immagino che l'application-side join sia l'unica strada da percorrere. Sto anche esaminando la funzione "lookup" del filtro "termini". Grazie comunque. – tungd

0

Hai due opzioni

elasticsearch annidata Oggetti

elasticsearch genitore & bambino

entrambi sono confrontati e valutati ben here

0

Somths come (solo fare Books Tipo come genitore per gli utenti e recensioni di tipi)

.../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" 
              } 
             } 
            } 
           } 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
    ' 
Problemi correlati