Выбор и настройка поискового движка
Поисковый движок находит документы, которые соответствуют запросу, и рассчитывает их релевантность. Модуль search передает ему документы при индексации и поисковую строку при запросе. Выбор движка нужен, чтобы согласовать качество поиска, объем индекса и требования к эксплуатации с инфраструктурой проекта.
Встроенный движок Bitrix подходит для начала работы и не требует отдельного сервиса. Полнотекстовый поиск СУБД использует возможности MySQL или PostgreSQL. Sphinx и OpenSearch выносят полнотекстовый индекс во внешний сервис и добавляют отдельные требования к подключению, настройке и наблюдению за его работой.
Движок не заменяет модуль search. После переключения сохраняются класс CSearch, стандартные компоненты, структура поискового документа и правила доступа. Меняются способ хранения полнотекстовых данных, разбор слов внутри движка и расчет релевантности.
Место движка в поиске
Модуль-источник формирует документ и передает его модулю search. Модуль хранит общие данные документа и направляет полнотекстовую часть выбранному движку.
Модуль-источник -> модуль search -> поисковый движок
| |
| -> полнотекстовый индекс
-> сайты, права, параметры и теги
Строка запроса -> модуль search -> поисковый движок -> совпадения -> выдача
Внутренний класс CSearchFullText выбирает реализацию и вызывает операции добавления, обновления, удаления, очистки и поиска. Не используйте его как точку расширения в коде проекта. Работайте через CSearch и стандартные компоненты. Прямые запросы к таблицам или внешнему индексу обходят общую обработку документов и усложняют переход на другой движок.
Подробную модель документа и распределение ответственности раскрывает статья Архитектура и поисковый индекс. Она поможет отличить проблему исходных данных от ошибки движка.
Что меняется при выборе движка
Движки получают один поисковый документ, но индексируют и сопоставляют его по своим правилам. Из-за этого одинаковый запрос может вернуть другой состав результатов или изменить их порядок.
|
Сохраняется |
Может измениться |
|
Вызовы |
Правила выделения и нормализации слов |
|
Идентификаторы |
Состав полнотекстовых совпадений |
|
Привязка документа к сайтам |
Оценка релевантности и порядок результатов |
|
Коды доступа и фильтрация по правам |
Поиск по началу слова в быстрых результатах |
|
Основные поля фильтра поискового запроса |
Поддержка и сочетание условий фильтра, скорость запроса |
|
Теги и пользовательское ранжирование |
Требования к ресурсам и обслуживанию |
Смена движка не исправляет неполный документ и неверные права. Если источник не передал текст или не обновил индекс после изменения объекта, любой движок получит устаревшие данные.
Морфология также зависит от выбранного варианта. Встроенный движок использует морфологический разбор модуля search. Sphinx применяет настройки morphology индекса реального времени (RT-индекса). OpenSearch выбирает языковой анализатор отдельно для каждого сайта. Полнотекстовые движки СУБД используют собственные правила разбора полнотекстового запроса. Поэтому перед переходом нужно собрать контрольные запросы для языков проекта и сравнить выдачу.
Сравнение движков
Начинайте выбор с инфраструктурного ограничения. Варианты MySQL и PostgreSQL появляются только для соответствующего типа подключения модуля search. Sphinx и OpenSearch требуют доступного внешнего сервиса.
|
Движок |
Где хранится полнотекстовый индекс |
Когда выбирать |
Главное ограничение |
|
Bitrix |
В таблицах модуля |
Нужен поиск без отдельного сервиса или важна простая эксплуатация |
Индексация и поиск создают нагрузку на основную СУБД |
|
MySQL |
В полнотекстовом индексе MySQL, которым управляет модуль |
Проект уже работает на MySQL и готов использовать его полнотекстовые возможности |
Вариант недоступен для другого типа СУБД |
|
PostgreSQL |
В полнотекстовом индексе PostgreSQL, которым управляет модуль |
Проект работает на PostgreSQL и не планирует отдельный поисковый сервис |
Вариант недоступен для другого типа СУБД |
|
Sphinx |
Во внешнем RT-индексе Sphinx |
Полнотекстовую нагрузку нужно вынести из основной СУБД и команда умеет обслуживать Sphinx |
Схема RT-индекса должна точно соответствовать требованиям модуля |
|
OpenSearch |
Во внешних индексах OpenSearch |
Нужны внешний поисковый кластер и языковые анализаторы для сайтов |
Проекту нужно обслуживать доступность, ресурсы и резервное копирование сервиса |
Универсального порога по числу документов нет. Размер текста, частота обновлений, сложность запросов и одновременная нагрузка влияют сильнее самого количества записей. Сравнивайте варианты на копии реального индекса и на характерных запросах проекта.
Bitrix
Встроенный движок bitrix выбран по умолчанию. Он хранит текст, основы слов и связи с документами в таблицах модуля. Отдельное сетевое подключение ему не нужно.
Выбирайте Bitrix для нового поиска, если нагрузочные тесты пока не показали необходимость внешнего сервиса. Такой старт уменьшает число зависимостей и дает эталонный набор результатов для дальнейшего сравнения.
Встроенная морфология может работать сразу при обновлении документа или через агента. Отложенный режим сокращает работу в запросе индексации, но новый текст попадет в морфологический индекс не сразу. Этот режим относится только к встроенному движку.
Полнотекстовый поиск MySQL
Движок mysql хранит подготовленный текст средствами модуля search и создает для него полнотекстовый индекс MySQL. Модуль предлагает этот вариант только при подключении типа MYSQL.
Выбирайте MySQL, когда отдельный сервис не нужен, а встроенный полнотекстовый индекс СУБД выдерживает ожидаемую нагрузку. Поиск остается в основной базе, поэтому запросы и обновления индекса конкурируют с остальной работой сайта за ее ресурсы.
Перед включением проверьте два условия:
-
хранилище полнотекстового содержимого модуля
searchсуществует и использует актуальную схему, -
СУБД позволяет создать полнотекстовый индекс по
SEARCHABLE_CONTENT.
Страница настроек проверяет эти условия при сохранении. Если таблицы нет, модуль сообщает об устаревшей схеме. Если СУБД не создает индекс, модуль показывает ошибку базы данных и не сохраняет переключение.
Полнотекстовый поиск PostgreSQL
Движок pgsql доступен при подключении типа PGSQL. Он хранит текст средствами модуля search. PostgreSQL подготавливает текст функцией to_tsvector() и создает для него полнотекстовый индекс типа GIN.
Выбирайте PostgreSQL по тем же инфраструктурным причинам, что и MySQL. Проект использует возможности своей СУБД и не добавляет внешний сервис. Перед переходом обязательно проверьте запросы на всех языках сайта. Модуль передает функции to_tsvector() конфигурацию english, поэтому результаты для других языков требуют отдельной оценки на данных проекта.
При сохранении настроек модуль проверяет наличие индекса и пытается создать его при необходимости. Ошибка создания отменяет переключение.
Sphinx
Движок sphinx записывает документы во внешний индекс реального времени и выполняет запросы через протокол MySQL. На сервере приложения должна быть доступна функция mysqli_connect. Сервер должен подключаться к адресу Sphinx.
Подготовьте обязательные строковые параметры до включения Sphinx.
-
sphinx_connection— обязательная строка с адресом и портом подключения. Значение по умолчанию равно127.0.0.1:9306. -
sphinx_index_name— обязательная строка с именем RT-индекса. Значение по умолчанию равноbitrix. Имя может содержать латинские буквы, цифры и символ подчеркивания.
Модуль проверяет соединение, наличие индекса, его тип rt и обязательные поля. В RT-индексе должны быть текстовые поля title и body, а также атрибуты модулей, элементов, дат, пользовательского ранга, тегов, прав, сайтов и параметров. Используйте конфигурацию с административной страницы настроек модуля как исходную схему. Произвольный набор полей не пройдет проверку.
Морфологию и поиск по началу слова настраивает Sphinx. Параметр morphology определяет языковую обработку. Для быстрых результатов компоненту bitrix:search.title нужен префиксный поиск с минимальной длиной от двух символов. Эти настройки входят в конфигурацию Sphinx, а не в PHP-вызов компонента.
Выбирайте Sphinx, если команда уже умеет обновлять сервис и настраивать его мониторинг. Модуль не устанавливает Sphinx и не управляет его процессом.
OpenSearch
Движок opensearch отправляет документы и запросы во внешний сервис по HTTP. Он создает шаблоны и индексы для сайтов по заданному базовому имени.
Соберите строковые параметры подключения до переключения на OpenSearch.
-
opensearch_connection— обязательная строка с адресом сервера, протоколом и портом. Значения по умолчанию нет. Например,https://search.example.ru:9200. -
opensearch_user— строка с именем пользователя для HTTP-аутентификации. Оставьте поле пустым, если сервис разрешает подключение без учетных данных. -
opensearch_password— строка с паролем пользователя. Заполните поле вместе сopensearch_user. Модуль хранит пароль в защищенном хранилище, а не среди обычных настроек. Пустое поле при повторном сохранении не заменяет ранее сохраненный пароль. -
opensearch_index— обязательная строка с базовым именем индекса. Значения по умолчанию нет. Имя может содержать латинские буквы, цифры, дефис и символ подчеркивания. -
opensearch_analyzer_<идентификатор_сайта>— строка с языковым анализатором для конкретного сайта. Выберите значение из списка на странице настроек модуляsearch. Страница сопоставляет анализатор с языком сайта, а при отсутствии соответствия используетenglish.
Учетная запись должна разрешать операции, которые нужны полному циклу поиска.
-
Читать сведения о сервисе и шаблоны индексов.
-
Создавать, обновлять и удалять шаблоны индексов.
-
Создавать индексы сайтов, записывать и удалять документы.
-
Выполнять поиск и удалять индексы во время полной переиндексации.
Этот список задает необходимые возможности, но не готовые имена ролей или разрешений. Их названия зависят от версии OpenSearch и механизма авторизации. Сопоставьте возможности с официальным описанием выбранного security-плагина. Проверьте набор разрешений для установленной версии сервиса.
Проверьте доступ на отдельном тестовом индексе. Разрешение только на чтение главной страницы OpenSearch подтвердит соединение, но не позволит модулю подготовить шаблоны и записать документы.
При сохранении модуль отправляет запрос к серверу и ожидает корректный JSON-ответ с кодом 200. Затем он проверяет шаблон индекса каждого сайта. Модуль обновляет шаблон, если его версия или языковой анализатор не совпадают с текущими настройками.
Анализатор влияет на формы слов, которые OpenSearch считает совпадениями. Проверяйте выбранное значение вручную для многоязычных сайтов и языков без прямого сопоставления.
Выбирайте OpenSearch, если проекту нужен внешний поисковый кластер и команда готова отвечать за его доступность. Интеграция модуля не заменяет настройку TLS, сетевых правил, ресурсов, мониторинга и резервного копирования OpenSearch.
HTTP-клиент модуля отключает проверку TLS-сертификата при обращении к OpenSearch. Не открывайте сервис для недоверенных сетей. Ограничьте доступ сетевыми правилами и отдельной учетной записью с необходимыми правами. После обновления модуля повторно проверьте это поведение и требования к сети.
Различия API между движками
Ограничения ниже подтверждены исходным кодом модуля search версии 25.200.0. После обновления модуля повторите контрольные сценарии, особенно если проект зависит от сортировки или нестандартных фильтров.
|
Возможность |
Bitrix, MySQL и PostgreSQL |
Sphinx |
OpenSearch |
|
Массив сортировки |
Поддерживается |
Поддерживается для своего набора полей |
Используется стандартный порядок; переданный массив не применяется |
|
|
Bitrix учитывает заголовок отдельно; MySQL и PostgreSQL используют |
Не применяется |
Не применяется |
|
Фильтр |
Поддерживается |
Не применяется |
Не применяется |
|
|
Дополняет SQL-фильтр |
Не вызывается поисковым движком |
Не вызывается поисковым движком |
|
|
Участвуют в разборе запроса модулем |
Не меняют запрос движка |
Не меняют запрос движка |
|
Пересчет через |
Обновляет веса для выдачи |
Не обновляет веса внешнего индекса |
Не обновляет веса внешнего индекса |
|
Изменение сайтов через |
Обновляет привязки |
Обновляет привязки |
Требует повторной индексации полного документа для обновления индексов сайтов |
Фильтр PARAMS также различается по движкам. Для переносимого условия передавайте одно имя с одним значением. Подробности и перечни полей собраны в статье Поисковые запросы через CSearch. Порядок применения весов объясняет настройка пользовательского ранжирования.
Проверить совместимость внешнего сервиса
Интеграция проверяет возможности сервиса, а не только номер его версии. Поэтому совпадение версии с рабочим окружением не заменяет пробную индексацию после обновления Sphinx, OpenSearch или модуля search.
Для Sphinx страница настроек модуля приводит схемы RT-индекса для веток 2.x и 3.x. Модуль дополнительно проверяет тип индекса и набор обязательных полей. Для работы с модулем сервис должен принимать соединение по протоколу MySQL, поддерживать RT-индекс нужной схемы и выполнять запись, поиск и удаление документов.
Для OpenSearch модулю нужны API шаблонов индексов, документов и поиска. Проверка главной страницы подтверждает только доступность сервиса. Совместимость подтверждает полный тест на версии, которую использует проект.
-
На тестовой установке задайте отдельное базовое имя индекса. Используйте те же анализаторы и права учетной записи, что и в рабочей среде.
-
Сохраните настройки подключения и убедитесь, что модуль подготовил шаблоны для сайтов.
-
Создайте тестовый документ в модуле-источнике и передайте его в индекс через штатный механизм источника или
CSearch::Index(). Найдите документ черезCSearchлибо стандартный компонент. Затем удалите документ штатным способом и обновите индекс. Не обращайтесь напрямую к API Sphinx или OpenSearch. -
Выполните контрольные запросы по заголовку, словоформе и началу слова.
-
Повторите тест после обновления модуля или внешнего сервиса.
Не переносите новую версию сервиса в рабочую среду только по результату успешного соединения. Зафиксируйте проверенную комбинацию версий модуля и движка в документации проекта.
Как выбрать вариант
Сначала исключите движки, для которых нет подходящей инфраструктуры. Затем сравните оставшиеся варианты на одинаковом наборе документов.
-
Зафиксируйте языки сайтов, объем индекса и частоту обновления документов.
-
Соберите контрольные запросы. Добавьте точные слова, словоформы, фразы, начало слова, теги и запросы без результатов.
-
Отметьте ожидаемые документы и порядок первых результатов для каждого запроса.
-
Измерьте время полной индексации, задержку обновления одного документа и время ответа под ожидаемой нагрузкой.
-
Проверьте выдачу пользователей с разными правами. Производительность не компенсирует утечку закрытого документа.
-
Оцените эксплуатацию. Учтите мониторинг сервиса, обновления, резервное копирование и восстановление индекса.
-
Выберите вариант с приемлемой выдачей и понятным способом восстановления. Не опирайтесь только на один быстрый запрос.
Bitrix служит отправной точкой, пока требования к качеству и нагрузочные тесты не обосновали отдельный сервис. MySQL или PostgreSQL позволяют остаться в текущей СУБД и использовать ее полнотекстовый индекс. Sphinx и OpenSearch стоит выбирать после проверки, что вынос нагрузки и возможности анализа оправдывают дополнительный сервис.
Как переключить движок
Переключение меняет место, где модуль ищет полнотекстовые совпадения. Старый индекс не становится индексом нового движка, поэтому после сохранения настройки нужна полная переиндексация.
Перейти на новый движок
-
Создайте резервную копию данных. Зафиксируйте текущий движок, его настройки и конфигурацию внешнего сервиса.
-
Сохраните контрольные запросы и первые результаты. Они понадобятся для сравнения состава и порядка выдачи.
-
Подготовьте СУБД или внешний сервис. Для Sphinx заранее создайте индекс реального времени с нужной схемой. Для OpenSearch выдайте учетной записи права на шаблоны, индексы, документы и поиск.
-
Начните технические работы: ограничьте публичный поиск и исключите параллельную переиндексацию. Затем в административном разделе откройте страницу Настройки > Настройки продукта > Настройки модулей > Поиск. Выберите движок и заполните появившиеся поля.
-
Сохраните настройки. Модуль проверит полнотекстовый индекс СУБД или подключение к внешнему сервису. Если страница покажет ошибку, исправьте ее и сохраните настройки снова. После успешного сохранения запросы начинают использовать новый движок, даже если его индекс еще не заполнен.
-
Откройте страницу Настройки > Поиск > Переиндексация и запустите полный проход. Сохраняйте ограничение публичного поиска до завершения проверки. Модуль очищает индекс перед повторным заполнением, поэтому до завершения переиндексации пользователь видит пустую или неполную выдачу.
-
Повторите контрольные запросы и сравните результаты. Проверьте морфологию, порядок, быстрый поиск по заголовкам, теги, даты и права.
-
Проверьте обновление одного документа. Измените известное слово в исходном объекте, дождитесь обновления индекса и найдите новый текст.
Не заканчивайте технические работы сразу после появления первых результатов. Сначала дождитесь окончания полного прохода и выполните все контрольные запросы.
Откатить переключение
Откат требует полной переиндексации. Простого возврата настройки недостаточно, потому что модуль мог уже очистить общий индекс или заполнить его только частично.
-
Остановите текущую переиндексацию и сохраните сообщение об ошибке.
-
В настройках модуля выберите прежний движок и восстановите его параметры подключения.
-
Сохраните настройки и убедитесь, что модуль принимает соединение или полнотекстовый индекс СУБД.
-
Запустите полную переиндексацию для прежнего движка.
-
Повторите эталонные запросы и проверьте документ с ограниченными правами.
-
Откройте сайт для пользователей после завершения индексации и проверки выдачи.
Не удаляйте конфигурацию прежнего движка до конца перехода. Она нужна для отката, если новый сервис не выдержит рабочую нагрузку или изменит состав выдачи.
Как диагностировать внешний движок
Недоступность Sphinx или OpenSearch влияет и на запись документов, и на выполнение запросов. Модуль проверяет соединение при сохранении настроек, но эта проверка не гарантирует дальнейшую доступность сервиса.
Автоматического перехода на Bitrix при ошибке внешнего движка нет. Код интеграции также не выполняет повторные попытки подключения. Ошибка Sphinx или OpenSearch может прервать индексацию либо поисковый запрос исключением. Поэтому проект должен регистрировать такие ошибки и следить за доступностью сервиса.
Проверяйте проблему по порядку.
-
Убедитесь, что адрес сервиса доступен с сервера сайта, а не только с рабочего компьютера.
-
Проверьте учетные данные и права пользователя OpenSearch. Для Sphinx проверьте доступ к порту протокола MySQL.
-
Сверьте имя индекса. Sphinx принимает только существующий RT-индекс с ожидаемыми полями. OpenSearch использует базовое имя для шаблонов и индексов сайтов.
-
Изучите сообщение исключения и журналы внешнего сервиса. Они помогают отличить сетевую ошибку от неверной схемы или запроса.
-
После восстановления обновите тестовый документ и выполните контрольный запрос. Проверка только главной страницы сервиса не подтверждает запись и чтение индекса.
-
Запустите полную переиндексацию, если часть документов не попала во внешний индекс во время сбоя.
Не удаляйте общий индекс модуля ради проверки соединения. Сначала восстановите сервис и подтвердите запись одного документа. Полная переиндексация нужна для восстановления согласованного набора данных, а не для поиска причины сетевой ошибки.
Границы выбора
Поисковый движок модуля search работает с общим индексом сайта. Полнотекстовый индекс отдельного ORM-объекта решает другую задачу. Он участвует в запросе к одной таблице и не подключает модель документов, сайтов и прав модуля search. Выбрать между общим поиском и ORM-запросом поможет статья Введение и выбор способа поиска.
Установка, обновление и настройка кластера Sphinx или OpenSearch не входят в интеграцию модуля. Их нужно выполнять по документации выбранного сервиса и правилам инфраструктуры проекта.
Выбранный движок должен давать предсказуемую выдачу и восстанавливаться по понятной процедуре. Начните с контрольных запросов, подтвердите права и языковую обработку, затем измерьте нагрузку. Такой порядок связывает технический выбор с качеством поиска, которое увидит пользователь.