2014-11-18 5 views
7

Ho un problema che richiede di recuperare un documento basato su id da elasticsearch e utilizzarlo per creare un'altra query. Funziona, ma sono costretto a fare due viaggi di andata al cluster elasticsearch. Posso in qualche modo farlo in una query qualcosa come query elasticsearch e utilizzare il suo output come input per un'altra query per evitare il round trip?ElasticSearch: utilizzo dell'output di una query come input a un altro

Per favore fatemi sapere se non capite il problema.

+0

Questo è stato chiesto più volte: http://stackoverflow.com/questions/26977932/elasticsearch-find-documents-by-another-document. E non credo ci sia altra opzione che quella o [mlt query] (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html). –

+0

Hai provato? Supponiamo di no, se non hai risposto a quelle risposte. Se l'hai fatto e stai ancora facendo domande al riguardo, cosa hai provato e perché non sei soddisfatto di mlt? –

+0

@AndreiStefan Può più, usare il filtro su determinati valori? Per quanto ne so, seleziona i termini e le ricerche pertinenti nel campo indicato, ma come posso forzare il filtro su alcuni campi? –

risposta

1

Desidero utilizzare questa opportunità per pubblicizzare un approccio diverso al problema indicato. In realtà, ElasticSearch: The Definitive Guide fa buon lavoro da solo, non mi resta che citarlo:

Quattro tecniche comuni vengono utilizzati per gestire dati relazionali in elasticsearch:

  • Applicazione sul lato unisce
  • oggetti
  • dati denormalizzazione
  • annidata
  • relazioni padre
  • /bambino

Spesso la soluzione finale richiede una miscela di alcune di queste tecniche .

La denormalizzazione dei dati in pratica significa che i dati vengono memorizzati in modo che una singola query esegua il trucco che si farebbe prima con due query consecutive.

Qui spiegherò the example dal libro di cui sopra. Supponiamo di avere due seguenti indici, e si desidera trovare tutti i post del blog scritto da una persona di nome John:

PUT /my_index/user/1 
{ 
    "name":  "John Smith", 
    "email": "[email protected]", 
    "dob":  "1970/10/24" 
} 

PUT /my_index/blogpost/2 
{ 
    "title": "Relationships", 
    "body":  "It's complicated...", 
    "userID":  1 
} 

non c'è altra scelta se non per andare a prendere prima gli ID di tutti Johns nel database. Che cosa si potrebbe fare, invece è quello di spostare alcune delle informazioni utente sull'oggetto blogpost:

PUT /my_index/user/1 
{ 
    "name":  "John Smith", 
    "email": "[email protected]", 
    "dob":  "1970/10/24" 
} 

PUT /my_index/blogpost/2 
{ 
    "title": "Relationships", 
    "body":  "It's complicated...", 
    "user":  { 
    "id":  1, 
    "name":  "John Smith" 
    } 
} 

Quindi consentendo di ricerca sulla user.name dell'indice blogpost.

Oltre ai metodi tradizionali elasticsearch si può anche considerare l'utilizzo di plugin di terze parti come Siren Join:

Questo join viene utilizzato per filtrare un set documento basato su un secondo set documento, da qui il suo nome. È equivalente all'operatore EXISTS() in SQL.

Problemi correlati