Как автоматически перестроить индекс Сфинкса в django-sphinx?
-
22-07-2019 - |
Вопрос
Я только что настроил django-sphinx, и он работает прекрасно. Теперь я могу искать свою модель и получать потрясающие результаты. Единственная проблема заключается в том, что мне приходится создавать индекс вручную с помощью команды indexer. Это означает, что каждый раз, когда я добавляю новый контент, мне приходится вручную нажимать на командную строку, чтобы перестроить поисковый индекс. Это просто недопустимо.
Я мог бы создать задание cron, которое бы автоматически запускало команду indexer, но это далеко не оптимально. Новые данные не будут проиндексированы, пока cron не запустится снова. Кроме того, индексатор будет работать без необходимости в большинстве случаев, так как на моем сайте данные не добавляются очень часто.
Как мне настроить его так, чтобы индекс Sphinx автоматически перестраивался при добавлении или изменении данных в модели django с возможностью поиска?
Решение
Существует две основные стратегии построения поисковых индексов:
<Ол>Первая стратегия имеет очевидное преимущество, заключающееся в том, что она ближе к реальному времени, но, возможно, имеет огромный недостаток в производительности. Большинство серверов баз данных с внутренними индексаторами имеют проблемы с производительностью (или отсутствующие функции), см., Например, Джефф Этвуд, обсуждающий проблемы производительности в SQL Server 2008 в своем блоге о добавление второго сервера для стекового потока .
Вторая стратегия не работает в режиме реального времени, но, как правило, имеет лучшую производительность. К сожалению, это также означает, что, поскольку она не является встроенной, ее нужно каким-то образом вызывать извне.
Очевидно, что у вас нет выбора с Sphinx , поскольку он является внешним индексатором. Вы должны вызвать индексатор сфинксов из cron или другого механизма планирования.
Чтобы ускорить индексирование, просто запускайте его часто из cron. Если это вызывает проблемы с производительностью, вам необходимо реализовать стратегию обновления в режиме реального времени который включает в себя очень частое индексирование новых записей в дельта-индекс, а затем периодически объединяет дельта-индекс в первичный индекс. Это будет сделано за пределами Django, поэтому это не повлияет на django-sphinx .
Другие советы
Сказанное выше звучит правильно для меня, хотя я упомяну, что вы можете вызвать индексатор из функции сохранения объекта.
Вероятно, это будет называться LOT, но это может сработать. Просто вызовите его, как любую внешнюю команду.