2010-09-03 4 views
17

Ho un modello che distribuisce un processo in ritardo che aggiorna alcuni dei suoi attributi. Il modello è dichiarato "ricercabile" ...sunspot_rails non reindicizzazione del modello dopo il salvataggio

searchable do 
    text :content, :stored => true 
end 

... che pensavo avrebbe reindicizzato dopo un salvataggio. Durante i test, questo non sembra essere il caso. Se corro: rake sunspot:reindex, allora tutto funziona come previsto. Cosa potrebbe causare questo problema?

+0

potresti aggiungere alcune parole chiave migliori a queste domande in modo da ottenere una migliore copertura? – Danny

+0

Non penso che questa domanda sia molto ben formulata, né le soluzioni. Per uno, l'utente ovviamente usa 'sunspot_rails', non solo 'sunspot'. Per due, le risposte suggerite discutono cose che sono discutibili a causa delle impostazioni di sunspot predefinite di sunspot_rails. – nessur

+0

Mi interessa anche un test rspec per il commit del modello, per assicurarmi che funzioni. –

risposta

5

L'indice riflette le modifiche solo dopo che è stato chiamato Sunspot.commit. Ciò accade automaticamente quando si esegue rake sunspot:reindex.

Il plugin Rotaie di Sunspot ha anche un'opzione di configurazione auto_commit_after_request che chiamerà Sunspot.commit_if_dirty dopo ogni richiesta, ma questo non verrà attivato dai processi in background.

La soluzione migliore è chiamare Sunspot.commit_if_dirty dopo l'ultima operazione nel processo in ritardo.

+2

(ripetendo me stesso) La domanda riguarda in realtà il plugin 'sunspot_rails', non la vaniglia sunspot. – nessur

20

Come menzionato da Jason, è possibile chiamare Sunspot.commit_if_dirty per inviare un commit dal proprio client.

Dal lato della configurazione del server, un altro approccio sarebbe quello di impostare la proprietà autoCommit nel proprio solrconfig.xml per emettere commit automaticamente quando sono state apportate modifiche all'indice. A maxTime di 60000 ms (un minuto) dovrebbe essere sufficiente per la maggior parte dei siti.

L'utilizzo di autoCommit è probabilmente la scelta più saggia nelle applicazioni di produzione, in cui un elevato volume di commit può facilmente influire sulle prestazioni del server Solr. In effetti, è una buona pratica con Sunspot a disabilitare il suo auto_commit_after_request option quando il tuo sito inizia a ricevere una quantità decente di aggiornamenti.

Infine, autoCommit ha il vantaggio di essere in grado di impostarlo e dimenticarlo.

Al Websolr, il nostro valore predefinito è di ignorare i commit emessi dal client in favore di autoCommit.

+2

la domanda riguarda in realtà il plugin 'sunspot_rails', non la vaniglia sunspot. – nessur

+4

Ciao nessur, non so che cosa stai cercando di fare qui.sunspot_rails è poco più di un involucro leggero per collegare Sunspot a modelli e controller Rails. Oltre a ciò, questa domanda si riduce all'emissione di commit, che puoi rilasciare da 'curl' per tutte le questioni relative al cliente. –

+0

La domanda riguarda la funzionalità 'auto-commit', e questo 'involucro leggero' aggiunge alla funzionalità di base di Sunspots, quindi è fin troppo rilevante quale gemma un utente abbia installato. Le funzionalità non documentate fanno girare il mondo e il principiante medio può essere incuriosito nell'apprendere che sunsport_rails installa un hook del controller che, per impostazione predefinita, commette tutte le modifiche in sospeso all'indice solr. – nessur

6

Ho avuto esattamente lo stesso problema di te: quando stavo testando la mia funzionalità di ricerca, sunspot non emetterebbe mai un commit su solr. Se richiamo manualmente Sunspot.commit tutto funziona. Mi sono divertito con auto_commit_after_request, ma questo è vero per impostazione predefinita, quindi non dovrebbe fare un altro.

Quindi dopo ulteriori indagini ho scoperto che Sunspot non emetterà un commit automaticamente a meno che la modifica non venga effettuata nel contesto di una richiesta web. Se si sta eseguendo una modifica da un test o un processo in background, è necessario chiamare Sunspot.commit manualmente.