Подтвердить что ты не робот

Sunspot_rails не повторная индексация модели после сохранения

У меня есть модель, которая развертывает замедленное задание, которое обновляет некоторые из его атрибутов. Модель объявлена ​​ "доступной для поиска"...

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

..., который, как я думал, будет повторно проиндексирован после сохранения. При тестировании это, похоже, не так. Если я запустил: rake sunspot:reindex, тогда все будет работать так, как ожидалось. Что может быть причиной этой проблемы?

4b9b3361

Ответ 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 после того, как последнее в вашей отложенной задаче.