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

StackOverflow https://stackoverflow.com/questions/1653071

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

    Другие советы

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top