Sphinx как движок поиска - служба, индекс, откат
Встроенный полнотекстовый поиск живёт в таблицах базы и упирается в неё же на большом сайте. Переносим его на внешний демон Sphinx: поднимаем службу в веб-окружении, переключаем модуль «Поиск» и держим наготове обратный путь.
Решение
Служба в меню окружения
Поднимаем инстанс из меню веб-окружения:
Configure Sphinx service for the pool 1. Create sphinx instance on server 2. Update sphinx instance 3. Remove sphinx instanceМастер спрашивает хост пула и базу данных, а в конце предлагает переиндексацию. Пункты обновления и удаления появляются в этом разделе только после того, как создан хотя бы один инстанс.
Адрес и порт демона
Смотрим, на чём слушает демон:
listen = 9312 # родной протокол Sphinxlisten = 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 = 128Mlemmatizer_base = /etc/sphinxsearch/dicts/ # сюда кладут словари *.pakmorphology = 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 и выше второй версии, иначе демон и модуль не договорятся.
Смежное
- Поиск по сайту на практике - оглавление подтемы
- Поиск по сайту - устройство индекса и морфологии
- Внешний поисковый движок: индекс, запрос, синхронизация - свой индекс каталога вместо штатного backend
- Настройка поиска по сайту: что индексировать, морфология, подсказки - состав индекса до смены движка
- Поиск не находит товары: индекс, переиндексация, выдача - разбор пустой выдачи
- Релевантность выдачи: правила сортировки, стоп-слова, вес - порядок результатов после переезда
- Живой поиск с подсказками: выдача, доступность, подстроки - подсказки в поле ввода
- Меню окружения и службы: что где лежит и как перезапустить - откуда запускают службы окружения
- BitrixVM и веб-окружение - обслуживание площадки целиком