После перехода с версии 1 на 2 в sphinx много изменений. Больше не работают запросы в командной строке через searh, удалены многие директивы из конфигурационного файла и другое. Будем разбираться.
Установка Sphinx 2.2.11 на Ubuntu / Debian и RHEL / CentOS 7
Для начала нужно поставить пакет:
Ubuntu/Debian:
aptitude install sphinxsearch
RHEL/CentOS:
yum install -y postgresql-libs unixODBC
wget http://sphinxsearch.com/files/sphinx-2.2.11-1.rhel7.x86_64.rpm
yum install sphinx-2.2.11-1.rhel7.x86_64.rpm
Настройка Sphinx 2.2.11 на Ubuntu / Debian и RHEL / CentOS 7
Ubuntu/Debian:
nano /etc/sphinxsearch/sphinx.conf
RHEL/CentOS:
vi /etc/sphinx/sphinx.conf
Сам конфигурационный файл Sphinx состоит из блоков для source, indexer и searchd.
Вот пример конфигурации Sphinx + дельта-индексы:
# for db connect to include in other sources
source dbconnect
{
type = mysql
sql_host = localhost
sql_user = your_db_user
sql_pass = your_db_pass
sql_db = your_db_name
sql_port = 3306
}
# --------- products --------- #
# sources products
source sphinx_source_products : dbconnect
{
sql_query_pre = SET NAMES utf8mb4
sql_query_pre = \
update sphinx_delta_counter \
set last_post_id = (select max(id) from tb_products) \
where index_name = 'sphinx_index_products';
sql_query = \
SELECT id, title, descr \
FROM tb_products \
WHERE status = 1 # or any your condition
# sql_attr_uint = id
sql_field_string = title
sql_field_string = descr
}
source sphinx_source_products_delta : dbconnect
{
sql_query_pre = SET NAMES utf8mb4
sql_query = \
SELECT id, title, descr \
FROM tb_products \
WHERE status = 1 AND id > (select last_post_id from sphinx_delta_counter where index_name = 'sphinx_index_products');
# sql_attr_uint = id
sql_field_string = title
sql_field_string = descr
}
# indexes products
index sphinx_index_products
{
source = sphinx_source_products
path = /home-path-to-web-dir/example.com/sphinx_data/sphinx_products
dict = keywords
morphology = stem_ru, stem_en
min_word_len = 2
docinfo = extern
}
index sphinx_index_products_delta
{
source = sphinx_source_products_delta
path = /home-path-to-web-dir/example.com/sphinx_data/sphinx_products_delta
dict = keywords
morphology = stem_ru, stem_en
min_word_len = 2
docinfo = extern
}
# --------- / products --------- #
# some tables
# what you need
# just as it is done section above
indexer
{
mem_limit = 32M
}
searchd
{
listen = 9312
listen = 9306:mysql41
log = /var/log/sphinx/searchd.log
query_log = /var/log/sphinx/query.log
read_timeout = 5
max_children = 30
pid_file = /var/run/sphinx/searchd.pid
# max_matches = 1000
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads # for RT to work
binlog_path =
# binlog_path = /var/log/sphinx
# use /var/log/sphinxsearch/ and /var/run/sphinxsearch/ paths for ubuntu
}
Замените тут “your_db_user”, “your_db_pass”, “your_db_name”, “/home-path-to-web-dir/example.com/” на свои значения. Создайте папку для хранения индексов, например “sphinx_data”. Отредактируйте sql_query и sql_query_pre под свою базу. Для этого необходимо продумать запрос для поиска, а также выбрать колонку поиска и прописать её в sql_field_string (если несколько – значит несколько строк прописать соотвественно).
Sphinx delta index. Индексирование больших объёмов данных.
Для того, чтобы не переиндексировать в течение дня (если у вас большая база данных mysql) всю базу, используются дельта-индексы. Просто создаём в базе mysql таблицу “sphinx_delta_counter” с колонкой “last_post_id”. Из запроса в конфиге, думаю, понятно, что сюда записывается последний проиндексированный id. В поиск потом нужно будет включить оба индекса.
Для работы с русским языком нужно установить кодировку базы: SET NAMES utf8 (или SET NAMES utf8mb4), а также морфологию: параметр stem_ru . Строку “sql_query_pre = SET NAMES utf8mb4” обязательно нужно прописывать в каждый source отдельно, если в общий connect -> это не работает. Долго пришлось мучаться с ошибкой из-за того, что sphinx не индексировал русские слова.
Настройка Sphinx для Yii2
- Поставить расширение yii2-sphinx для Yii.
- Отредактировать config/main.php (секция components):
'sphinx' => [
'class' => 'yii\sphinx\Connection',
'dsn' => 'mysql:host=127.0.0.1;port=9312;',
'username' => '', # тут обычно не надо ничего указывать
'password' => '', # тут обычно не надо ничего указывать
],
- Полнотекстовый поиск с морфологией и прочими плюшками:
use yii\sphinx\Query;
$query_search = new Query();
$search_result = $query_search->from('siteSearch')->match($q)-all();
Индексация, запуск и проверка Sphinx
После настройки конфигурационного файла sphinx нужно проиндексировать все source, которые мы создали:
indexer --all
Потом прописать в крон (как тут видно – раз в сутки пересоздаётся полный индекс, а каждые 5 минут – дельта):
crontab -e
0 1 * * * /usr/bin/indexer --config /etc/sphinx/sphinx.conf sphinx_index_course --rotate > /dev/null
*/5 * * * * /usr/bin/indexer --config /etc/sphinx/sphinx.conf sphinx_index_course_delta --rotate > /dev/null
Перед запуском службы полезно будет сделать владельцем папки с индексами sphinxsearch (или sphinx):
chown sphinxsearch: /home-path-to-web-dir/example.com/sphinx_data
Запускаем Sphinx командой:
systemctl start searchd
В Ubuntu (или Debian), возможно получите сообщение:
Failed to start searchd.service: Unit searchd.service not found.
В этом случае – попробуйте такой вариант:
systemctl start sphinxsearch
Можно также включать sphinx альтернативной командой:
/etc/init.d/sphinxsearch start
Также, возможно, необходимо в файле /etc/default/sphinxsearch будет прописать START=yes (вместо START=no).
Чтобы проверить, можно воспользоваться такой командой:
systemctl status searchd
или
systemctl status sphinxsearch
Также, чтобы убедиться, что служба работает и слушает заданные порты:
ps aux | grep search
lsof -i tcp:9306
lsof -i tcp:9312
Раньше (в sphinx 1.x) можно было проверить поиск в консоли:
search -i название_индекса "слова поиска"
Теперь эту функцию убрали, но, всё равно есть возможность проверить, всё ли хорошо с индексацией и попадают ли нужные слова в индекс.
Вместо поиска в консоли sphinx можно использовать следующую команду:
indextool --dumphitlist sphinx_index_course "какое-нибудь слово" | more
Кроме того, можно проверить поиск с помощью MySQL-клиента, как предлагает разработчик Sphinx:
# To query search daemon using MySQL client:
mysql -h 0 -P 9306
mysql> SELECT * FROM test1 WHERE MATCH(‘test’);
Ошибки при запуске Sphinx
любые deprecated – это наследие от предыдущих версий – закомментируйте или удалите эти параметры