sunspot_rails не переиндексирует модель после сохранения - PullRequest
17 голосов
/ 03 сентября 2010

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

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

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

Ответы [ 3 ]

20 голосов
/ 13 декабря 2010

Как уже упоминал Джейсон, вы можете позвонить Sunspot.commit_if_dirty, чтобы выдать коммит из вашего клиента.

Со стороны конфигурации сервера, другой подход мог бы установить свойство autoCommit в вашем solrconfig.xmlавтоматически выдавать коммиты, когда в ваш индекс внесены изменения.maxTime 60000 мс (одна минута) должно быть достаточно для большинства сайтов.

Использование autoCommit, вероятно, является более разумным выбором в производственных приложениях, где большой объем коммитов может легко повлиять на производительность вашего сервера Solr.На самом деле, рекомендуется использовать Sunspot для отключения auto_commit_after_request option, когда ваш сайт начинает получать приличное количество обновлений.

Наконец, autoCommit имеет то преимущество, что можетустановите его и забудьте о нем.

На Websolr по умолчанию мы игнорируем выданные клиентом коммиты в пользу autoCommit.

7 голосов
/ 09 декабря 2010

Индекс будет отражать изменения только после вызова Sunspot.commit. Это происходит автоматически при запуске rake sunspot:reindex.

Плагин Sunspot Rails также имеет параметр конфигурации auto_commit_after_request, который будет вызывать Sunspot.commit_if_dirty после каждого запроса, но это не будет запускаться вашими фоновыми процессами.

Лучше всего позвонить Sunspot.commit_if_dirty после того, как последняя вещь в вашей отложенной работе.

6 голосов
/ 17 октября 2013

У меня была та же проблема, что и у вас - когда я тестировал свою функцию поиска, солнечная точка никогда не выдала коммит для решения.Если я вручную позвоню Sunspot.commit все работает.Я возился с auto_commit_after_request, но это по умолчанию, поэтому он не должен вносить изменений.

Так что после еще одного исследования я обнаружил, что Sunspot не будет выдавать коммит автоматически, если изменение не будет внесеноконтекст веб-запроса.Если вы вносите изменения в тестовую или фоновую работу, вам нужно вызвать Sunspot.commit вручную.

...