2012-11-30 6 views
5

Sto utilizzando Tyre ed elasticsearch per fornire funzionalità di ricerca su un modello MongoMapper, che fa parte di un'applicazione Rails. Ho appena imbattuto in un problema in cui le mappature per questo modello non venivano aggiornate quando ho riassegnato a un ambiente che utilizza la seguente configurazione (in config/ambienti/env_name.rb):ricaricamento di mappature pneumatico/elasticsearch per un modello che contiene già dati memorizzati

config.cache_classes = true 

ricaricare la sola classe di didn Sembra che il problema sia risolto (forse comprensibilmente, le nuove mappature potrebbero non essere incompatibili con i dati esistenti, immagino?). invece ho dovuto fare quanto segue:

MyModel.index.delete 
<restart the app or reload the class> 
MyModel.index.import MyModel.all 

Mi chiedevo solo se c'è un modo migliore di a). assicurando che gli ultimi mapping definiti nel mio codice modello vengano utilizzati da elasticsearch dopo ogni distribuzione ma b). evitando inutili ripopolamento dell'indice con il set di dati completo?

Normalmente schierano con Chef, così ho potuto automatizzare i tre passi che ho usato con successo senza troppi problemi. Ma sono nuovo di elasticsearch e di gomme, quindi ho pensato che è molto probabile che mi stia abusando di entrambe le cose o rendendo le cose inutilmente difficili.

risposta

5

paio di punti qui:

  • Tire cerca di creare l'indice con la corretta mappatura quando i carichi di classe
  • ma pneumatico non non tentativo di creare l'indice per il modello, quando esiste già

Quindi, la tua domanda è davvero più sul corretto flusso di lavoro? Quando si distribuisce una nuova versione dell'applicazione, non è necessario ri-popolare l'indice, nello stesso modo in cui non si ri-popolare il database da una sorta di backup.

Controllare automaticamente la mappatura dell'indice conforme alla definizione corrente nel modello è certamente possibile (confrontare lo MyModel.tire.index.mapping con MyModel.tire.mapping, ri-compilare se diverso, ecc.), È qualcosa che farei diffidare.

Lo sviluppatore di solito sa quando ha cambiato la mappatura e deve ri-index dei dati. Eliminare l'indice e ripopolare significa anche tempi di inattività della ricerca e non è nemmeno fattibile per le applicazioni di grandi dimensioni.

Una soluzione migliore consiste nell'utilizzare un nome indice specifico come my-index-2012-12 durante l'importazione dei dati e indicare un alias my-index in questo indice. Quindi puoi riopopolare liberamente l'indice e capovolgere l'alias quando hai finito, senza tempi di fermo. Tyre si impegna a supportarti in questo tipo di flusso di lavoro (l'attività di importazione di Rake, ecc.).

+0

Ero un po 'confuso dal tuo ultimo paragrafo, non capisco come puoi usare un alias in un altro indice per evitare il centro. Nello scenario che hai descritto Will not searching against my-index è appena stato eseguito contro my-index-2012-12 mentre è stato reindicizzato? – concept47

+0

Grazie per la risposta ai dettagli. Segnalo come corretto, poiché non riesco a trovare un'alternativa. Sembra che il punto centrale della risposta sia che dovrai reindicizzare i dati nel mio scenario e puoi usare alias elasticsearch per evitare tempi di inattività in questo scenario.Ecco il link con ulteriori informazioni sugli alias elasticsearch: http://www.elasticsearch.org/guide/reference/api/admin-indices-aliases.html La pagina gomme github ora collega a questo e contiene informazioni sugli alias dell'indice – willjthomas

+0

@ concept47 come per la pagina github di pneumatici ora: puoi indicizzare i tuoi dati in un nuovo indice (e magari aggiornare un alias una volta che tutto va bene). Quindi non si ricrea l'indice esistente, si crea una nuova versione quindi si capovolge l'alias. Per favore correggimi se ho torto – willjthomas