Sunspot_rails не повторная индексация модели после сохранения
У меня есть модель, которая развертывает замедленное задание, которое обновляет некоторые из его атрибутов. Модель объявлена "доступной для поиска"...
searchable do
text :content, :stored => true
end
..., который, как я думал, будет повторно проиндексирован после сохранения. При тестировании это, похоже, не так. Если я запустил: rake sunspot:reindex
, тогда все будет работать так, как ожидалось. Что может быть причиной этой проблемы?
Ответы
Ответ 1
Как уже упоминалось Джейсоном, вы можете вызвать Sunspot.commit_if_dirty
, чтобы выдать коммит от своего клиента.
На стороне конфигурации сервера другой подход состоял в том, чтобы установить свойство autoCommit
в solrconfig.xml
, чтобы автоматически выдавать фиксации, когда были внесены изменения в ваш индекс. A maxTime
60000 мс (одна минута) должно быть достаточным для большинства сайтов.
Использование autoCommit
, вероятно, является более разумным выбором в производственных приложениях, где большой объем коммитов может легко повлиять на производительность вашего сервера Solr. Фактически, хорошая практика с Sunspot отключить его auto_commit_after_request option
, когда ваш сайт начнет получать приличное количество обновлений.
Наконец, autoCommit
имеет то преимущество, что его можно установить и забыть.
В Websolr по умолчанию мы игнорируем сделанные клиентом коммиты в пользу autoCommit
.
Ответ 2
У меня была такая же проблема, как и вы - когда я тестировал свое функциональное средство поиска, sunspot никогда не выдавал фиксацию для solr. Если я вручную вызову Sunspot.com, все будет работать. Я работал с auto_commit_after_request, но по умолчанию это правда, поэтому он не должен отличаться.
Итак, после некоторого расследования я обнаружил, что Sunspot не будет автоматически выдавать фиксацию, если изменение не будет сделано в контексте веб-запроса. Если вы делаете изменения из теста или фонового задания, вам нужно вручную вызвать Sunspot.commit.
Ответ 3
Индекс отражает только изменения после вызова Sunspot.commit
. Это происходит автоматически при запуске rake sunspot:reindex
.
Плагин Sunspot Rails также имеет параметр конфигурации auto_commit_after_request
, который будет вызывать Sunspot.commit_if_dirty
после каждого запроса, но это не будет вызвано вашими фоновыми процессами.
Лучше всего называть Sunspot.commit_if_dirty
после того, как последнее в вашей отложенной задаче.