Sphinx и Catalyst

By | 22.08.2016

Как реализовать поиск помощью Sphinx в Catalyst-приложении. Как создать приложение Catalyst, конфиги для Sphinx.

Приложение создавалось на Ubuntu 14.04, perl 5.18, Sphinx версии 2.2.10, модуль Sphinx::Search 0.29. Sphinx от версии к версии меняет функциональность и принципы работы, иногда очень значительно. Модуль Sphinx::Search тоже. Поэтому, не факт, что приведенный ниже код будет работать и у вас в неизменном виде.

В общем, собираясь углубиться в Sphinx тему, надо быть готовым к проблемам совместимости, версионности и т.п.

Создаем приложение Catalyst

Я часто начинаю заметку с создания Catalyst-приложения с нуля. Делаю это для наглядности. Подобный подход позволяет показать полный код созданных контроллеров, моделей и представлений, не выдирая из приложения только нужные куски. Кроме того, демонстрируемый код не содержит данных, которые относятся к чему-либо еще, кроме рассматриваемой темы.

Создаем директорию www в корневом каталоге. Заходим в нее и создаем приложение:

Создаем представление:

Вносим правки в файл /www/myapp/lib/myapp/View/TT.pm :

Указываем настройки для TT в файле /www/myapp/lib/myapp.pm . Обращаем внимание, что по умолчанию уже подключен плагин ConfigLoader . Вот его и будем использовать для работы с конфигами.

Внутри /www/myapp создаем директорию /conf, внутри нее директорию /sphinx – чтобы отделить конфиги sphinx от остальных.

Создаем контроллер:

У нас имеется БД mysql, в которой есть таблица – users (достаточно стандартный пример, т.к. таблица users, в том или ином виде, есть почти в любом приложении, где вводится авторизация):

Создание Sphinx индекса

Сначала надо подготовить конфиги сфинкса.

/etc/sphinxsearch/sphinx.conf :

Обычно, конфиг Sphinx выглядит совсем по-другому. Но в данном случае, выносим все данные по отдельным файлам и размещаем в директориях нашего приложения. Так будет намного удобнее вносить изменения. Кроме того, конфиги сфинкса окажутся под “зонтиком” системы контроля версий (если конечно, разработка приложения ведется с использованием git или других систем).

indexer.conf :

searchd.conf :

sources.conf :

users.conf :

Запускаем индексацию:

Наш индекс – самый обычный (plain). Добавлять в него данные нельзя. Можно только проводить регулярно переиндексацию (например, специальным скриптом через cron). Если хочется обновления данных в режиме реального времени, придется заморочиться с real-time индексами.

Теперь хорошо бы проверить, был ли создан индекс на самом деле, или нет. Запустим демона Sphinx и попробуем что-нибудь найти.

Пробная попытка найти что-нибудь:

Catalyst и Sphinx

Указываем Catalyst-приложению данные для подключения к Sphinx-серверу.

/www/myapp/conf/myapp.yaml :

Добавляем в контроллере коннект к сфинксу и запрос данных.

/www/myapp/lib/myapp/Controller/Users.pm :

В данном случае используется подключение через API. Современные версии Sphinx позволяют получать данные с помощью mysql-клиента, в приложении можно использовать DBI – это намного удобнее. Второй вариант рассмотрим в следующей заметке, про создание real-time индекса.

Теперь нам нужно добавить простую html-страничку, на которой можно будет отобразить все полученные от Sphinx данные.

Рисуем самый простой шаблон.

/www/myapp/templates/users.tt :

Теперь попробуем запустить приложение catalyst и организовать поиск по пользователям.

В адресной строке браузера вводим http://192.168.56.10:3000/users . Результат:

Остановить Sphinx можно с помощью команды:

Проблемы, возникшие в процессе работы со Sphinx

Не запускается search из командной строки

Увы и ах, в последних версиях Sphinx search больше не существует. Можно использовать mysql-клиента или api. Жаль, было удобно.

Как запретить автозапуск демона Sphinx

Проблема была в автозапуске демона при старте системы. Причем, демона невозможно было убить, процесс моментально возрождался. Возможно, это удобно, когда речь идет о боевом сервере и требуется, чтобы Sphinx был запущен всегда. Но в процессе разработки и отладки, постоянной пересборке real-time индексов – подобное поведение демона недопустимо.

Решение – снять флаг перезапуска в файле /etc/default/sphinxsearch :

Ошибка запуска Sphinx демона

Переходим к мистике. При попытке запуска Sphinx демона возникла ошибка. Ошибка видна только в логах сфинкса. Стартует демон “благополучно” и замечаний не выдает. Просто тихо дохнет сразу после выдачи в STDOUT всех положенных сообщений. Текст ошибки в логах:

Вероятнее всего (предполагаю), ошибка связана с тем, что выполнялись обновления Sphinx и пошел конфликт версий. Ранее созданные файлы данных оказались с новой версией не совместимы.

Что помогло:

  1. Удалить все что находится в директории data. Удалить все файлы индексов.
  2. Заново запустить индексацию.
  3. Запустить демона sphinx.

Как просматривать данные в индексах Sphinx с помощью mysql-клиента

Сначала вносим правки в конфиг сфинкса searchd.conf :

Перезапускаем демона Sphinx.

Используем стандартный консольный mysql-клиент:

Если вы потеряли своего Sphinx демона

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

Проблема заключалась в том, что демон сфинкса уже был запущен на другом порту. Необходимо было найти и прибить его. Очень удобно смотреть кто какой порт занял, с помощью netstat:

Ну и конечно же, “sudo ps -u root -f” никто не отменял.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code