Sphinx и drupal на примере blogroll-pcmag-ru
новость от 01.03.2010 19:58:29 под моей редакцией для отображения технической сути
Sphinx(Сфинкс) является системой полнотекствого поиска, распространяемой под лицензией GPL второй версии.
Сфинкс позволяет добавить функции быстрого полнотекстового поиска в сторонние приложения и был специально спроектирован для взаимодействия с реляционными базами данных и скриптовыми языками программирования. На данный момент движок позволяет индексировать данные, хранящиеся в базах данных MySQL, PostgreSQL или в любом другом формате через XML-шлюз.
На blogroll.pcmag.ru запущен поисковый модуль. Собственно, необходимость в нем ощущалась довольно давно, несмотря на то, что все записи там плотно перевязаны и авто классифицированы умными роботами, расставляющими сообразные смыслу теги, иногда возникала надобность найти нечто, не попавшее по формальным признакам в главный смысловой кластер описания.
Сложность заключается в том, что то, что когда-то задумывалось как небольшой проект, за пару лет жизни разрослось в весьма и весьма обширную БД. Сейчас там примерно 150 тыс. записей, со всей служебной информацией (логи, кэши и др.) БД готовится перевалить за гигабайт.
Стандартные средства поиска в Drupal (а именно на этой CMS сделан сайт) решить такие задачи могут… Теоретически. На практике, СУБД на сервере загружается просто до неприличного уровня, сам Drupal любит БД, да еще и поисковые запросы… Фокусы с полнотекстовыми индексами в MySQL тоже не годятся, при таких объемах индекс начинает существенно тормозить вставку новых записей. Плюс есть сложности со стеммнгом (русский язык все-таки), с языком запросов, группировкой данных и др. Ну и в целом не дело это, специализированной задачей грузить сервер общего назначения.
В итоге, было решено испробовать Sphinx.
Сам по себе Shinx оказался достаточно прост в инсталляции.
Sphinx формирует собственный индекс, откуда и вынимает данные. В БД не лазит. Как следствие, его надо сопрягать с Drupal. Существует два модуля, sphinxsearch и просто sphinx (Sphins Integration), первый весьма развесистый по функциональности, интегрируется со стандартным Search, имеет подсистемы разграничения доступа, контроля числа запросов (типа анонимные посетители могут сделать 10 запросов в час, зарегистрированные — 300) и др. Второй попроще, практически не документирован, но сделан более рационально.
Модуль sphinxsearch пытается интегрироваться с поисковым модулем через XMLPipe.
На практике — чудовищный оверхед при передаче данных из БД поисковому индексатору, масса излишнего кода для управления всем этим хозяйством, странные глюки, связанные с попытками этого кода как-то контролировать ресурсы, необходимость привлекать для загрузки данных из XMLPipe wget индексирование свойств — надо было переписывать модуль.
Решено юзать модуль, sphinx.
Недоставало — возможности контроля количества запросов — решилось стандартными средствами Drupal (функции контроля «флуда»). А самое главное — не умничает. Цепляется сразу к БД, без промежуточных извращений, индекс генерируется за ~30 с.