Как автоматически перестроить индекс Сфинкса в django-sphinx? - PullRequest
2 голосов
/ 31 октября 2009

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

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

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

Ответы [ 2 ]

5 голосов
/ 31 октября 2009

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

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

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

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

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

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

0 голосов
/ 17 апреля 2010

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

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

...