Sphinx это мощнейший поисковый движок, очень быстрый, умеет работать с различными словарями и искать по словоформам. Ну и много чего еще.
Выбираем версию http://sphinxsearch.com/downloads/ (здесь речь пойдет о 2.0.1-beta)
1 2 3 4 |
$ 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 |
Если после этого шага вываливается примерно такая ошибка:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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
и запустить процесс конфигурации еще раз
1 2 |
$ apt-get install libmysql++-dev $ ./configure --prefix=/usr/local/sphinx --with-mysql |
и продолжить в обычном режиме
1 2 |
$ make $ make install |
Готово, теперь sphinx необходимо настроить. Пример конфигурационного файла (более подробно можно посмотреть разумеется в документации):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# Базовые настройки источника данных - информация о подключении к БД # Реальные источники данных будут от него наследоваться # Я предпочел создать отдельного пользователя и дать ему права на чтение только на необходимые таблицы 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 } |
Далее запустим индексатор для первоначального создания индекса
1 |
$ /usr/local/sphinx/bin/indexer -all |
Теперь нам понадобится shell скрипт для запуска и остановки демона, что бы можно было его потом добавить в автозагрузку. Создаем скрипт:
1 |
$ vim /etc/init.d/sphinx |
Вставляем код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#! /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 |
Далее надо сделать его выполняемым и добавить в запуск при старте
1 2 |
$ chmod +x /etc/init.d/sphinx $ update-rc.d sphinx defaults |
Ну вот практически и все, осталось добавить перестроение поискового индекса по крону. В примере конфигурации добавлен один индекс — сообщения на форуме. Будем считать что индексов у нас будет много и разных. Перестраивать их необходимо так же с разным интервалом в зависимости от частоты изменения данных и размера данных. Поэтому создадим отдельный файл, куда будем складывает задания для sphinx
1 |
$ vim /etc/cron.d/sphinx |
поместим пока единственную строку для переиндексации сообщений например на форуме:
1 |
*/12 * * * * root /usr/local/sphinx/bin/indexer --rotate forumPostIndex > /dev/null 2>&1 |
и перезапустим планировщик задач
1 |
$ /etc/init.d/cron restart |
Самая главная ссылка: http://sphinxsearch.com/docs/current.html