2010-09-03 4 views
17

J'ai un modèle qui déploie un travail retardé qui met à jour certains de ses attributs. Le modèle est déclaré "consultable" ...sunspot_rails ne réindexe pas le modèle après l'enregistrement

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

... que je pensais ré-indexer après une sauvegarde. Au test, cela ne semble pas être le cas. Si je cours: rake sunspot:reindex, alors tout fonctionne comme prévu. Qu'est-ce qui pourrait causer ce problème?

+0

pourriez-vous ajouter quelques meilleurs mots-clés à ces questions afin qu'il soit mieux accessible? – Danny

+0

Je ne pense pas que cette question soit très bien formulée, pas plus que les solutions. D'une part, l'utilisateur utilise évidemment 'sunspot_rails', pas seulement 'sunspot'. Pour deux, les Réponses ont suggéré de discuter des choses qui sont sans intérêt en raison des paramètres de taches solaires par défaut de sunspot_rails. – nessur

+0

Je suis également intéressé par un test rspec pour les validations de modèles, pour s'assurer qu'il fonctionne. –

Répondre

5

L'index reflétera uniquement les modifications après l'appel de Sunspot.commit. Cela se produit automatiquement lorsque vous exécutez rake sunspot:reindex.

Le plugin Sunspot's Rails dispose également d'une option de configuration auto_commit_after_request qui appellera Sunspot.commit_if_dirty après chaque requête mais cela ne sera pas déclenché par vos processus d'arrière-plan.

Votre meilleur pari est d'appeler Sunspot.commit_if_dirty après comme dernière chose dans votre emploi retardé.

+2

(en me répétant) La question est en fait à propos du plugin 'sunspot_rails', pas de la tache solaire à la vanille. – nessur

20

Comme mentionné par Jason, vous pouvez appeler Sunspot.commit_if_dirty pour émettre un commit de votre client. Du côté de la configuration du serveur, une autre approche consiste à définir la propriété autoCommit dans votre solrconfig.xml pour émettre automatiquement des validations lorsque des modifications ont été apportées à votre index. Un maxTime de 60000 ms (une minute) devrait suffire pour la plupart des sites. L'utilisation de autoCommit est probablement le choix le plus judicieux dans les applications de production, où un volume élevé de validations peut facilement affecter les performances de votre serveur Solr. En fait, c'est une bonne pratique avec Sunspot pour désactiver son auto_commit_after_request option lorsque votre site commence à obtenir une quantité décente de mises à jour.

Enfin, autoCommit a l'avantage de pouvoir le régler et l'oublier.

A Websolr, notre défaut est d'ignorer les commits émis par le client en faveur de autoCommit.

+2

la question est en réalité au sujet du plugin 'sunspot_rails', pas de la tache solaire de vanille. – nessur

+4

Salut nessur, pas sûr de ce que vous essayez de faire ici.sunspot_rails est un peu plus qu'un wrapper léger pour accrocher Sunspot aux Rails et aux contrôleurs. En outre, cette question se résume à des commits d'émission, que vous pouvez émettre à partir de «curl» pour toutes les questions client. –

+0

La question porte sur la fonctionnalité 'auto-commit', et cette très légère 'wrapper' ajoute à la fonctionnalité de base de Sunspots, donc c'est trop pertinent quel gem a été installé par un utilisateur. Les fonctionnalités non documentées font tourner le monde, et le novice moyen pourrait être intrigué d'apprendre que sunsport_rails installe un hook de contrôleur qui, par défaut, valide toutes les modifications en attente de l'index solr. – nessur

6

J'ai eu exactement le même problème que vous - lorsque je testais ma fonctionnalité de recherche, la tâche solaire ne produisait jamais un commit pour solr. Si j'appelle manuellement Sunspot.commit tout fonctionne. J'ai tripoté avec auto_commit_after_request, mais c'est vrai par défaut donc ça ne devrait pas faire de différence. Par conséquent, après un examen plus poussé, j'ai constaté que Sunspot n'émettra pas de validation automatiquement à moins que la modification ne soit effectuée dans le contexte d'une requête Web. Si vous effectuez une modification à partir d'un test ou d'un travail d'arrière-plan, vous devez appeler Sunspot.commit manuellement.