Как автоматически перестроить индекс Сфинкса в django-sphinx?

Я просто настроил django-sphinx, и он прекрасно работает. Теперь я могу искать свою модель и получать потрясающие результаты. Единственная проблема заключается в том, что мне приходится создавать индекс вручную с помощью команды indexer. Это означает, что каждый раз, когда я добавляю новый контент, мне приходится вручную нажимать на командную строку, чтобы перестроить поисковый индекс. Это просто не приемлемо.

Я мог бы создать задание cron, которое бы автоматически запускало команду indexer, но это далеко не оптимально. Новые данные не будут проиндексированы, пока cron не запустится снова. Кроме того, индексатор будет работать без необходимости в большинстве случаев, так как мой сайт не добавляет данные очень часто.

Как мне настроить его так, чтобы индекс Sphinx автоматически перестраивался при каждом добавлении или изменении данных в модели django с возможностью поиска?

2 ответа

Решение

Существует две основные стратегии построения поисковых индексов:

  1. Индексатор, внутренний для сервера базы данных, который индексирует на лету, когда записи вставляются или удаляются.
  2. Индексатор, внешний по отношению к базе данных (которая может быть, а может и не быть RDMS, именно поэтому я оставляю слово сервер), который периодически индексирует.

Первая стратегия имеет очевидное преимущество, заключающееся в том, что она ближе к реальному времени, но, возможно, имеет огромный недостаток в производительности. Большинство серверов баз данных с внутренними индексаторами имеют проблемы с производительностью (или отсутствующие функции), см., Например, Джефф Этвуд, обсуждающий проблемы с производительностью в SQL Server 2008 в своем блоге о добавлении второго сервера для стекового потока.

Вторая стратегия не в реальном времени, но, как правило, имеет лучшую производительность. К сожалению, это также означает, что, поскольку она не является встроенной, ее нужно каким-то образом вызывать извне.

Очевидно, у вас нет выбора со Сфинксом, поскольку он является внешним индексатором. Вы должны вызвать индексатор сфинксов из cron или другого механизма планирования.

Чтобы ускорить индексирование, просто запускайте его часто из cron. Если это вызывает проблемы с производительностью, вам необходимо реализовать стратегию оперативного обновления, которая включает в себя очень частую индексацию новых записей в дельта-индекс, а затем периодически объединяет дельта-индекс в первичный индекс. Это будет сделано за пределами Django, так что это никак не повлияет на django-sphinx.

Вышесказанное звучит правильно для меня, хотя я упомяну, что вы можете вызвать индексатор из вашей функции сохранения для объекта.

Вероятно, это будет называться много, но это может сработать. Просто назовите это как любую внешнюю команду.

Другие вопросы по тегам