2012-03-04 2 views
12

Le applicazioni Web di grandi dimensioni offrono una ricerca "globale" che combina i dati di vari indici fulltext (questa sarebbe una tabella in SQL) per fornire un risultato di ricerca combinato ordinato in base al punteggio. Allora supponiamo di avere video, articoli di blog e gli utenti, poi, quando si digita "casa" nella ricerca potrebbe portare a risultati come questo (in ordine di punteggio):Ricerca multiindice in ElasticSearch (Tyre)

  • My Home (articoli di blog)
  • Home Town (utente)
  • io voglio andare a casa (video)

qualcuno sa come eseguire tale ricerca combinata con elasticsearch? Preferibilmente usando la gemma Tyre per Rails, ma anche i dati JSON ElasticSearch grezzi funzionerebbero.

Grazie.

risposta

16

riguardo pneumatici, c'è una distinzione importante: stai usando esso autonomo o nel processo di integrazione/ActiveModel ActiveRecord.

Nel primo caso, basta cercare su più indici, Tire.search ['indexA', 'indexB'] do ... end. Oppure cerca nell'intero cluster, Tire.search do ... end (equivalente a curl 'http://localhost:9200/_search?q=*').

In quest'ultimo caso, Tyre non gestisce bene le ricerche multi-modello, al momento. Nota questa richiesta di pull: https://github.com/karmi/tire/pull/218 - crea il tuo gioiello con questa patch applicata e aiuta a testare la soluzione.

UPDATE

attuale pneumatici (> 0.4) in grado di caricare più istanze modello più che bene. Vedere lo integration test per esempio.

+1

Una risposta direttamente dal proprietario della gemma :) Molte grazie! E sì, lo sto usando con ActiveRecord. Nel caso peggiore, imposterò semplicemente: load => false in modo che non generi alcun oggetto ActiveRecord. – matsko

+0

Sì, senza ': load', si otterranno i modelli" elastici ", istanze di' Tire :: Results :: Item'. Tuttavia, le ricerche su più modelli sono qualcosa che dovremmo supportare e mi piace la patch in questione n. 218. – karmi

1

Sono abbastanza sicuro che l'endpoint http://127.0.0.1:9200/_search farà il trucco per voi. Più del 99% dei miei dati è in un indice, quindi è difficile per me verificarlo qui per voi.

Inoltre, controllare l'endpoint multi-ricerca: http://www.elasticsearch.org/guide/reference/api/multi-search.html

+0

Qual è il vantaggio/svantaggio dal mettere la maggior parte dei tuoi dati in un singolo indice ES? La ricerca è sicuramente più facile, meno complessa, ma di qualsiasi aspetto negativo? – raffian

+0

A volte non è possibile avere solo 1 indice singolo. A volte basta calcolare male il numero # di frammenti in anticipo e creare un nuovo indice è più veloce della reindicizzazione di tutto nuovamente in un altro indice. –