Перейти к содержимому

Sphinx как движок поиска - служба, индекс, откат

Встроенный полнотекстовый поиск живёт в таблицах базы и упирается в неё же на большом сайте. Переносим его на внешний демон Sphinx: поднимаем службу в веб-окружении, переключаем модуль «Поиск» и держим наготове обратный путь.

Решение

Служба в меню окружения

Поднимаем инстанс из меню веб-окружения:

Configure Sphinx service for the pool
1. Create sphinx instance on server
2. Update sphinx instance
3. Remove sphinx instance

Мастер спрашивает хост пула и базу данных, а в конце предлагает переиндексацию. Пункты обновления и удаления появляются в этом разделе только после того, как создан хотя бы один инстанс.

Адрес и порт демона

Смотрим, на чём слушает демон:

listen = 9312 # родной протокол Sphinx
listen = 9306:mysql41 # MySQL-протокол, его и просит модуль «Поиск»
binlog_max_log_size = 512M

Модуль связывается с демоном по протоколу MySQL, поэтому в настройках его ждёт порт 9306, а не 9312. Доступность проверяем обычным клиентом:

Окно терминала
mysql -h 127.0.0.1 -P 9306 --default-character-set=utf8

Переключение модуля «Поиск»

Задаём три поля на закладке «Морфология»:

Полнотекстовый поиск с помощью = Sphinx
Строка подключения (протокол MySql) = localhost:9306
Идентификатор индекса = bitrix

Идентификатор индекса - это имя блока в конфиге демона, а не произвольная подпись. Полное имя печатает мастер окружения при создании инстанса, его и переносим в настройки модуля.

Имя и структура индекса

Сверяем идентификатор с конфигом демона:

index bitrix
{
type = rt # real-time индекс, данные пишутся на лету
path = /var/lib/sphinxsearch/data/bitrix
morphology = stem_enru, soundex
min_prefix_len = 2 # отсюда берётся поиск по части слова
rt_field = title # полнотекстовые поля, по которым ищут
rt_field = body
rt_attr_uint = item_id # атрибуты нужны для фильтрации выдачи
charset_type = utf-8
}

Расхождение в имени модуль показывает сообщением о ненайденном индексе. У Sphinx 3.x синтаксис другой: rt_field превращается в field, а rt_attr_* - в attr_*, и часть ключей уходит совсем.

Первая переиндексация

Запускаем полный проход и следим за фоновой задачей:

10. Background pool tasks
1. View running tasks

Смена backend не переносит данные из таблиц встроенного поиска в RT-индекс, и до конца прохода выдача остаётся неполной. На крупном сайте проход занимает два-три часа и больше, логи задачи лежат в /opt/webdir/temp.

Морфология и словари

Подключаем словари лемматизатора:

lemmatizer_cache = 128M
lemmatizer_base = /etc/sphinxsearch/dicts/ # сюда кладут словари *.pak
morphology = lemmatize_ru_all, lemmatize_en_all

Лемматизация разбирает формы точнее стеммера stem_enru, но требует скачанных словарей в этом каталоге. С версии модуля «Поиск» 24.0.0 поддерживается только UTF-8, поэтому старые словари в другой кодировке не подходят.

Возврат на штатный индекс

Возвращаем встроенный backend до удаления службы:

Полнотекстовый поиск с помощью = Bitrix

Порядок здесь не стилистика: сначала переключаем модуль, и только потом снимаем инстанс пунктом 3. Remove sphinx instance. После возврата снова нужен полный проход, потому что таблицы b_search_content_stem за время работы демона устарели.

Типичные проблемы

В настройках выбран Sphinx, а админка пишет, что индекс не найден.

Идентификатор индекса не совпал с именем блока в конфиге демона. Полное имя инстанса печатает мастер окружения при создании службы.

Мастер падает с сообщением bxSphinx::createSphinx: not in the pool.

Сайт не заведён в пуле окружения или его установка не доведена до конца. Инстанс создаётся только для сайта, который окружение считает своим.

Переход прошёл, а переиндексация завершается ошибкой.

Обмен с демоном упирается в предельный размер пакета на стороне базы. Помогает лимит на закладке «Индексация» или правка настройки сервера.

Новые синонимы в списке словоформ не действуют после перезапуска демона.

Real-time индекс перечитывает словоформы не при старте службы, а при переконфигурации индекса. После правки файла запускают переиндексацию из админки.

Службу удалили, и поиск на сайте пропал целиком.

Модуль остался переключённым на Sphinx и стучится в несуществующий демон. Backend возвращают на встроенный до снятия инстанса, а не после.

Частые вопросы

Обязательно ли делать переиндексацию после перехода на Sphinx?

Да. Смена backend не переносит данные из таблиц встроенного поиска в RT-индекс демона, и до конца полного прохода выдача будет пустой или неполной. Мастер окружения предлагает запустить проход сразу после создания инстанса.

Почему в меню окружения нет пунктов обновления и удаления Sphinx?

Они появляются только после создания хотя бы одного инстанса пунктом 1. Create sphinx instance on server. На чистом окружении в разделе виден единственный пункт создания.

Правда, что Sphinx ищет по части слова, а встроенный поиск нет?

Поиск по префиксу включает ключ min_prefix_len в конфиге индекса. Встроенный backend такой настройки не имеет: он ищет морфологией по стемам в таблицах b_search_content_stem и b_search_stem.

Можно ли вынести Sphinx на отдельный сервер пула?

Да, инстанс создаётся на выбранном хосте, а строка подключения в настройках модуля указывает его адрес и порт 9306. Так поиск перестаёт делить память и диск с основным веб-узлом.

Установили Sphinx 3.x, а модуль его не видит. Что не так?

Поддержка третьей ветки появилась только в версии модуля «Поиск» 25.0.0. На более раннем модуле берут ветку из диапазона 2.1.1 и выше второй версии, иначе демон и модуль не договорятся.

Смежное

Первоисточник