Введение и выбор способа поиска

Модуль Поиск search ищет материалы сайта по заранее подготовленному индексу. Модули-источники передают в индекс заголовок, текст, адрес, привязку к сайту и права. Затем модуль search разбирает запрос пользователя, отбирает доступные документы и формирует выдачу. Такой механизм нужен для единого поиска по данным с разной структурой, например, по статическим страницам, инфоблокам и форумам.

Поисковый индекс хранит копию данных, которые нужны для поиска. Результат зависит не только от исходного объекта. Документ должен попасть в индекс и оставаться актуальным после изменения содержимого, адреса или прав.

Для готового интерфейса используйте стандартные компоненты. Для собственного сценария индексации или обработки выдачи обращайтесь к PHP API модуля.

Основные понятия

Поисковый индекс — набор подготовленных документов, по которым модуль выполняет запрос. Индекс отделен от хранилищ модулей-источников.

Индексируемый документ — представление одного материала в поиске. Документ содержит идентификаторы владельца и элемента, заголовок, текст, адрес, сайты, права и дополнительные признаки.

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

Строка запроса — текст, который модуль разбирает по правилам языка поиска. Запрос может содержать слова, фразы и логические операторы.

Морфология — сопоставление запроса с формами слов. Настройки морфологии влияют на состав выдачи.

Релевантность — вычисленная оценка соответствия документа запросу. Модуль может использовать ее при сортировке результатов.

Тег — дополнительная метка документа. Теги помогают ограничить поиск и собрать облако близких тем.

Как выбрать механизм поиска

Сначала определите область данных и ожидаемый результат. Модуль search подходит не для каждой выборки.

Задача

Механизм

Почему

Найти материалы разных модулей через одну строку запроса

Модуль search

Общий индекс объединяет документы разных источников и учитывает их привязку к сайту и права

Создать публичную страницу поиска с формой, подсказками и постраничной навигацией

Компоненты модуля search

Компоненты формируют интерфейс и используют поисковый индекс

Найти текст в одном ORM-объекте с подготовленным полнотекстовым полем

Полнотекстовый запрос ORM

Запрос работает с данными одного ORM-объекта и не требует общего индекса сайта

Отобрать записи по идентификатору, статусу, дате или другому точному полю

Фильтр ORM или API модуля-источника

Прямая выборка читает актуальные значения и не зависит от переиндексации

Найти данные по предметным правилам конкретного модуля

API модуля-источника

Такой API знает структуру данных и поддерживаемые условия выборки

Полнотекстовый запрос ORM и модуль search решают разные задачи. Метод whereMatch() задает условие для полнотекстового поля одного ORM-объекта. Модуль search собирает отдельные документы из разных источников и возвращает общую выдачу.

Подробнее о построении ORM-запросов читайте в статье Построитель запросов.

Точный фильтр лучше поиска по индексу, если пользователю не нужны морфология, релевантность и единая выдача. Индекс может отставать от исходных данных до следующего обновления. Прямой запрос получает текущее состояние объекта.

Модуль отделяет подготовку документов от выполнения пользовательского запроса.


Модуль-источник -> поисковый документ -> индекс
                                          |
Строка запроса -> разбор и ограничения -> выдача

Цикл состоит из четырех этапов.

  1. Модуль-источник формирует документ и передает его в индекс.

  2. Модуль search подготавливает текст и сохраняет данные для последующих запросов.

  3. Пользователь отправляет строку запроса. Модуль учитывает сайт, область поиска, даты и другие заданные ограничения.

  4. Модуль проверяет доступ текущего пользователя и возвращает подходящие документы в выбранном порядке.

Модуль search не знает внутреннюю структуру данных источника. Источник отвечает за полноту документа и синхронизацию индекса. Статья Архитектура и поисковый индекс показывает подробные связи и жизненный цикл документа.

Подключение модуля

Подключите модуль перед обращением к его PHP API. Метод Loader::includeModule() принимает строковый идентификатор search и возвращает false, если модуль недоступен.

use Bitrix\Main\Loader;

if (!Loader::includeModule('search'))
{
    throw new \RuntimeException('Модуль search не установлен');
}

После неудачного подключения не продолжайте сценарий. PHP-классы и функции модуля могут быть недоступны.

Как выбрать точку входа

После выбора модуля search определите, нужен ли готовый интерфейс или классический PHP API. Отдельного объектного API в пространстве имен Bitrix\Search у модуля нет. Метод Loader::includeModule() относится к Главному модулю и только подключает search.

Задача

Точка входа

Результат

Показать поле поиска и отдельную страницу выдачи

bitrix:search.form и bitrix:search.page

Готовая форма, результаты и постраничная навигация

Добавить динамический поиск по заголовкам

bitrix:search.title

Поле ввода с быстрыми результатами по заголовкам

Показать подсказки или работать с тегами

bitrix:search.suggest.input, bitrix:search.tags.input, bitrix:search.tags.cloud

Подсказки, ввод тегов или облако тегов

Добавить, изменить или удалить документ в индексе

Статические методы CSearch

Обновленный поисковый индекс

Выполнить запрос и самостоятельно обработать результаты

Методы CSearch::Search() и CSearch::Fetch()

Последовательность доступных документов

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

PHP API выбирайте, когда код сам формирует документы, задает сложную область поиска или передает результаты в собственный интерфейс. При этом разработчик отвечает за проверку ошибки запроса и безопасный вывод данных.

Первый запрос к индексу

Перед запуском подключите пролог Bitrix Framework и модуль search. В индексе должен существовать доступный текущему пользователю документ сайта s1 со словом «уведомления». Замените идентификатор сайта и строку запроса своими значениями.

Метод Search() выполняет запрос, а Fetch() читает следующий результат. Пустая выдача не является ошибкой запроса.

$search = new \CSearch();
$search->Search([
    'QUERY' => 'уведомления',
    'SITE_ID' => 's1',
    'TAGS' => '',
]);

if ((int)$search->errorno !== 0)
{
    throw new \RuntimeException($search->error);
}

$document = $search->Fetch();

Переменная $document содержит массив результата или false, если доступных совпадений нет. Сбой базы данных или внешнего движка может прервать вызов исключением. Полный сценарий с обработкой ошибок, навигацией и безопасным выводом приведен в статье Поисковые запросы через CSearch.

Если нужных документов еще нет в индексе, настройте индексацию собственного контента или запустите переиндексацию существующих источников.

Границы API

Модуль search отвечает за общий индекс, разбор поисковой строки и выдачу. Он не заменяет:

  • API модуля-источника для чтения и изменения исходных объектов,

  • ORM-фильтры для точных условий по полям,

  • проверку прав на изменение исходных данных в модуле-источнике,

  • обслуживание внешнего поискового сервиса.

Выбор движка меняет способ выполнения полнотекстового поиска внутри модуля, но не превращает индекс в источник исходных данных. Сравните доступные варианты по критериям из статьи Выбор и настройка поискового движка.

Для индексации и поиска используйте класс CSearch. Не заменяйте его прямой работой с таблицами индекса. Такой код зависит от внутреннего хранения и обходит обработку прав, событий и поискового движка.

Выберите продолжение по задаче:

Начните с выбора механизма. Если нужен общий поиск по сайту, определите источники, правила доступа и способ обновления индекса. Затем выберите компоненты для готового интерфейса или CSearch для собственного сценария.