2012-06-29 10 views
9

Usiamo Sunspot Solr per l'indicizzazione e la ricerca nella nostra applicazione Ruby on Rails.Come reindicizzare solo alcuni oggetti in Sunspot Solr

Abbiamo voluto reindicizzare alcuni oggetti e qualcuno ha eseguito accidentalmente il comando Product.reindex dalla console di Rails. Il risultato è stato che l'indicizzazione di tutti i prodotti è iniziata da zero e il nostro catalogo è apparso vuoto durante l'indicizzazione.

Dal momento che abbiamo una grande quantità di dati che il reindicizzazione è stata presa tre giorni fino ad ora. Questa mattina, quando ho controllato i progressi della reindicizzazione, sembra che ci sia stata una voce di dati corrotti che ha comportato l'arresto della reindicizzazione senza completare.

non posso riavviare l'intera operazione Product.reindex come ci vuole troppo tempo. C'è un modo per eseguire solo la reindicizzazione sui prodotti selezionati? Voglio selezionare una gamma di prodotti che non sono indicizzati e quindi eseguire solo indicizzazione su questo. Come posso aggiungere un singolo prodotto all'indice senza dover eseguire un reindex completo dell'intero set di dati?

+0

Quando si dice - Come posso aggiungere un singolo prodotto per l'indice, senza ..", vuoi dire una sola colonna/campo o un sottoinsieme di documenti? – user1452132

risposta

7

ho trovato la risposta su https://github.com/sunspot/sunspot#reindexing-objects

Ogni volta che un oggetto viene salvato, viene reindicizzazione automaticamente come parte delle callback salvataggio. Quindi tutto ciò che era necessario era aggiungere tutti gli oggetti che necessitavano di reindicizzare ad un array e quindi fare un ciclo attraverso l'array, chiamando save su ogni oggetto. Questo ha aggiornato con successo gli oggetti richiesti nell'indice.

+0

Come ha conosciuto quelli che non erano stati ancora indicizzato? – kidbrax

+0

Abbiamo fatto alcuni controlli a campione manuali. Sapevamo che la reindex si è bloccata a un certo punto dopo aver prodotto prodotti dal 2011, quindi abbiamo controllato manualmente alcuni dei nostri prodotti dal 2012. Quindi abbiamo eseguito query nella console di Rails per costruire una matrice contenente questi prodotti e salvarli di nuovo, attivando i callback. – Stanley

+1

Se la reindicizzazione richiede così tanto tempo, è possibile che tu lo stia facendo in modo ingenuo, senza prendere in considerazione le associazioni che stai utilizzando nelle definizioni di ricerca. Ecco come funziona l'azione rake integrata ed è molto lenta. Il comando reindex può includere anche gli include di ActiveRecord, consentendo una maggiore efficienza. Ho preso un indice completo da 15 minuti a 15 secondi. Prova questa sintassi: '' 'Book.solr_reindex (: batch_size => 1000,: include => [: autore, {: capitoli =>: paragrafi}])' '' Vedi anche se stai permettendo inutilmente parola parziale ricerche, che ingigantiscono davvero l'indice. –

12

Sunspot fa indice un oggetto nella richiamata salvare in modo si potrebbe risparmiare ogni oggetto, ma forse che innescherebbe altri callback troppo. Un modo più preciso per farlo sarebbe

Sunspot.index [post1, post2] 
Sunspot.commit 

o con autocommit

Sunspot.index! [post1, post2] 

si potrebbe anche passare in relazioni oggettuali in quanto sono solo una serie troppo

Sunspot.index! post1.comments 
Problemi correlati