Установка и настройка Sphinx на debian
Sphinx это мощнейший поисковый движок, очень быстрый, умеет работать с различными словарями и искать по словоформам. Ну и много чего еще.
Выбираем версию http://sphinxsearch.com/downloads/ (здесь речь пойдет о 2.0.1-beta)
$ cd sphinx-2.0.1-beta
# указываем что установить надо в /usr/local/sphinx и с поддержкой MySQL
$ ./configure --prefix=/usr/local/sphinx --with-mysql
Если после этого шага вываливается примерно такая ошибка:
******************************************************************************
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 и запустить процесс конфигурации еще раз
$ ./configure --prefix=/usr/local/sphinx --with-mysql
и продолжить в обычном режиме
$ 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
}
Далее запустим индексатор для первоначального создания индекса
Теперь нам понадобится shell скрипт для запуска и остановки демона, что бы можно было его потом добавить в автозагрузку. Создаем скрипт:
Вставляем код:
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
Далее надо сделать его выполняемым и добавить в запуск при старте
$ update-rc.d sphinx defaults
Ну вот практически и все, осталось добавить перестроение поискового индекса по крону. В примере конфигурации добавлен один индекс – сообщения на форуме. Будем считать что индексов у нас будет много и разных. Перестраивать их необходимо так же с разным интервалом в зависимости от частоты изменения данных и размера данных. Поэтому создадим отдельный файл, куда будем складывает задания для sphinx
поместим пока единственную строку для переиндексации сообщений на форуме:
и перезапустим планировщик задач
Полезные ссылки
- Самая главная ссылка: http://sphinxsearch.com/docs/current.html
- Поиск по PDF, DOC, DOCX файлам с помощью Sphinx и PHP (огромный минус материала в использовании библиотеки Zend для чтения из исходных документов – pdf, doc, docx)
- Создание собственной поисковой системы с помощью PHP (материал аж 2007 года, с того момента могло многое измениться)