заметки на полях

Блокнот разработчика

Установка и настройка Sphinx на debian

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

Выбираем версию http://sphinxsearch.com/downloads/ (здесь речь пойдет о 2.0.1-beta)

$ tar xzvf sphinx-2.0.1-beta.tar.gz
$ cd sphinx-2.0.1-beta
# указываем что установить надо в /usr/local/sphinx и с поддержкой MySQL
$ ./configure --prefix=/usr/local/sphinx --with-mysql

Если после этого шага вываливается примерно такая ошибка:

checking MySQL libraries... configure: error: missing libraries.

******************************************************************************
ERROR: cannot find MySQL libraries.

Check that you do have MySQL libraries installed.
The package name is typically 'mysql-devel'.

If libraries are installed on your system, but you are still getting
this message, you should do one of the following:

1) either specify libraries location explicitly, using --with-mysql-libs;
2) or specify MySQL installation root location explicitly, using --with-mysql;
3) or make sure that the path to 'mysql_config' program is listed in
your PATH environment variable.

To disable MySQL support, use --without-mysql option.
******************************************************************************

Необходимо установить недостающую библиотеку libmysql++-dev и запустить процесс конфигурации еще раз

$ apt-get install libmysql++-dev
$ ./configure --prefix=/usr/local/sphinx --with-mysql

и продолжить в обычном режиме

$ make
$ make install

Готово, теперь sphinx необходимо настроить. Пример конфигурационного файла (более подробно можно посмотреть разумеется в документации):

# Базовые настройки источника данных - информация о подключении к БД
# Реальные источники данных будут от него наследоваться
# Я предпочел создать отдельного пользователя и дать ему права на чтение только на необходимые таблицы
source baseSource
{
        type                    = mysql
        sql_host                = localhost
        sql_user                = sphinx
        sql_pass                = password
        sql_db                  = basename

        mysql_connect_flags     = 32 # 32- включение сжатие при обмене данными с БД

        # Включам нужную кодировку соединения и выключаем кеш запросов
        sql_query_pre                   = SET NAMES utf8
        sql_query_pre                   = SET SESSION query_cache_type=OFF
}

# описываем источник данных. Информация о подключении к БД берется из родителя
# здесь же описываем как выбирать данные
source forumPostSource : baseSource
{
        # запрос для дробления получения топиков на неколько итераций
        sql_query_range         = SELECT MIN(id),MAX(id) FROM forum_post
        # сколько получать объектов за итерацию
        sql_range_step          = 1000

    # запрос на выборку данных
        sql_query               = SELECT fp.id, fp.theme_id, ft.category_id, ft.name AS theme_name, UNIX_TIMESTAMP(fp.created_time) AS created_time, fp.front_text FROM forum_post AS fp JOIN forum_theme AS ft ON (fp.theme_id = ft.id) \
                WHERE fp.deleted = 0 AND ft.deleted = 0 AND fp.id >= $start AND fp.id <= $end

    # описываем аттрибуты
        sql_attr_timestamp      = created_time
        sql_attr_uint           = theme_id
        sql_attr_uint           = category_id
}

# настройки хранения данных (индекса)
index forumPostIndex
{
        source                  = forumPostSource
        path                    = /usr/local/sphinx/var/data/forumPost
        docinfo                 = extern

        mlock                   = 0

        # Используемые морфологические движки
        morphology              = stem_enru

        # Кодировака данных из источника        
        charset_type            = utf-8
        charset_table = 0..9, A..Z->a..z, _, a..z, U+0401->U+0435, U+0451->U+0435, U+410..U+42F->U+430..U+44F, U+430..U+44F


        # Из данных источника HTML-код нужно вырезать
        html_strip                              = 1
}

# Настройки индексатора
indexer
{
        mem_limit               = 32M
}

# Настройка демона-поисковика
searchd
{
        listen                  = 9306:mysql41
        log                     = /usr/local/sphinx/var/log/searchd.log
        query_log               = /usr/local/sphinx/var/log/query.log
        query_log_format    = sphinxql
        read_timeout            = 5
        max_children            = 30
        pid_file                = /usr/local/sphinx/var/log/searchd.pid
        max_matches             = 100000
        seamless_rotate         = 1
        preopen_indexes         = 1
        unlink_old              = 1
        workers                 = threads # for RT to work
}

Далее запустим индексатор для первоначального создания индекса

$ /usr/local/sphinx/bin/indexer -all

Теперь нам понадобится shell скрипт для запуска и остановки демона, что бы можно было его потом добавить в автозагрузку. Создаем скрипт:

$ vim /etc/init.d/sphinx

Вставляем код:

#! /bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/sphinx/bin/searchd
NAME=sphinx
DESC=sphinx

#test -x $DAEMON || exit 0

case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --pidfile /usr/local/sphinx/var/log/searchd.pid --exec $DAEMON -- -c /usr/local/sphinx/etc/sphinx.conf || true
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --pidfile /usr/local/sphinx/var/log/searchd.pid --exec $DAEMON || true
echo "$NAME."
;;
restart)
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --pidfile /usr/local/sphinx/var/log/searchd.pid --exec $DAEMON -- -c /usr/local/sphinx/etc/sphinx.conf || true
sleep 1
start-stop-daemon --start --quiet --pidfile /usr/local/sphinx/var/log/searchd.pid --exec $DAEMON -- -c /usr/local/sphinx/etc/sphinx.conf || true
echo "$NAME."
;;
*)
echo "Usage: $NAME {start|stop|restart}" >&2
exit 1
;;
esac

exit 0

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

$ chmod +x /etc/init.d/sphinx
$ update-rc.d sphinx defaults

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

$ vim /etc/cron.d/sphinx

поместим пока единственную строку для переиндексации сообщений на форуме:

*/12 * * * * root /usr/local/sphinx/bin/indexer --rotate forumPostIndex > /dev/null 2>&1

и перезапустим планировщик задач

$ /etc/init.d/cron restart

Полезные ссылки

Leave a Reply