Введение и выбор способа поиска
Модуль Поиск search ищет материалы сайта по заранее подготовленному индексу. Модули-источники передают в индекс заголовок, текст, адрес, привязку к сайту и права. Затем модуль search разбирает запрос пользователя, отбирает доступные документы и формирует выдачу. Такой механизм нужен для единого поиска по данным с разной структурой, например, по статическим страницам, инфоблокам и форумам.
Поисковый индекс хранит копию данных, которые нужны для поиска. Результат зависит не только от исходного объекта. Документ должен попасть в индекс и оставаться актуальным после изменения содержимого, адреса или прав.
Для готового интерфейса используйте стандартные компоненты. Для собственного сценария индексации или обработки выдачи обращайтесь к PHP API модуля.
Основные понятия
Поисковый индекс — набор подготовленных документов, по которым модуль выполняет запрос. Индекс отделен от хранилищ модулей-источников.
Индексируемый документ — представление одного материала в поиске. Документ содержит идентификаторы владельца и элемента, заголовок, текст, адрес, сайты, права и дополнительные признаки.
Модуль-источник — владелец исходных данных. Он определяет содержимое документа, его адрес и права, а также обновляет индекс после изменений.
Строка запроса — текст, который модуль разбирает по правилам языка поиска. Запрос может содержать слова, фразы и логические операторы.
Морфология — сопоставление запроса с формами слов. Настройки морфологии влияют на состав выдачи.
Релевантность — вычисленная оценка соответствия документа запросу. Модуль может использовать ее при сортировке результатов.
Тег — дополнительная метка документа. Теги помогают ограничить поиск и собрать облако близких тем.
Как выбрать механизм поиска
Сначала определите область данных и ожидаемый результат. Модуль search подходит не для каждой выборки.
|
Задача |
Механизм |
Почему |
|
Найти материалы разных модулей через одну строку запроса |
Модуль |
Общий индекс объединяет документы разных источников и учитывает их привязку к сайту и права |
|
Создать публичную страницу поиска с формой, подсказками и постраничной навигацией |
Компоненты модуля |
Компоненты формируют интерфейс и используют поисковый индекс |
|
Найти текст в одном ORM-объекте с подготовленным полнотекстовым полем |
Полнотекстовый запрос ORM |
Запрос работает с данными одного ORM-объекта и не требует общего индекса сайта |
|
Отобрать записи по идентификатору, статусу, дате или другому точному полю |
Фильтр ORM или API модуля-источника |
Прямая выборка читает актуальные значения и не зависит от переиндексации |
|
Найти данные по предметным правилам конкретного модуля |
API модуля-источника |
Такой API знает структуру данных и поддерживаемые условия выборки |
Полнотекстовый запрос ORM и модуль search решают разные задачи. Метод whereMatch() задает условие для полнотекстового поля одного ORM-объекта. Модуль search собирает отдельные документы из разных источников и возвращает общую выдачу.
Подробнее о построении ORM-запросов читайте в статье Построитель запросов.
Точный фильтр лучше поиска по индексу, если пользователю не нужны морфология, релевантность и единая выдача. Индекс может отставать от исходных данных до следующего обновления. Прямой запрос получает текущее состояние объекта.
Как работает поиск по индексу
Модуль отделяет подготовку документов от выполнения пользовательского запроса.
Модуль-источник -> поисковый документ -> индекс
|
Строка запроса -> разбор и ограничения -> выдача
Цикл состоит из четырех этапов.
-
Модуль-источник формирует документ и передает его в индекс.
-
Модуль
searchподготавливает текст и сохраняет данные для последующих запросов. -
Пользователь отправляет строку запроса. Модуль учитывает сайт, область поиска, даты и другие заданные ограничения.
-
Модуль проверяет доступ текущего пользователя и возвращает подходящие документы в выбранном порядке.
Модуль 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.
|
Задача |
Точка входа |
Результат |
|
Показать поле поиска и отдельную страницу выдачи |
|
Готовая форма, результаты и постраничная навигация |
|
Добавить динамический поиск по заголовкам |
|
Поле ввода с быстрыми результатами по заголовкам |
|
Показать подсказки или работать с тегами |
|
Подсказки, ввод тегов или облако тегов |
|
Добавить, изменить или удалить документ в индексе |
Статические методы |
Обновленный поисковый индекс |
|
Выполнить запрос и самостоятельно обработать результаты |
Методы |
Последовательность доступных документов |
Компоненты подходят для типовой публичной части. Они связывают параметры страницы с запросом, навигацией и шаблоном результата. Настройте компоненты по инструкции в статье Поиск на сайте через компоненты.
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. Не заменяйте его прямой работой с таблицами индекса. Такой код зависит от внутреннего хранения и обходит обработку прав, событий и поискового движка.
Связанные материалы
Выберите продолжение по задаче:
-
Статья Поиск на сайте через компоненты поможет собрать форму, страницу выдачи, подсказки и теги из стандартных компонентов.
-
Статья Архитектура и поисковый индекс объясняет состав документа, права и жизненный цикл записи.
-
Статья Выбор и настройка поискового движка сравнивает встроенный поиск, MySQL, PostgreSQL, Sphinx и OpenSearch.
-
Руководство Индексация собственного контента объясняет добавление, обновление и удаление документов.
-
Статья Поисковые запросы через CSearch показывает фильтры, сортировку, навигацию и обработку результатов.
-
Материал Ранжирование, теги и поисковые подсказки помогает настроить ранжирование, теги, статистику фраз и подсказки.
-
Статья События и расширение поиска перечисляет точки изменения документа, запроса, URL и проверки прав.
-
Статья Переиндексация и диагностика поиска помогает диагностировать пустую или устаревшую выдачу.
Начните с выбора механизма. Если нужен общий поиск по сайту, определите источники, правила доступа и способ обновления индекса. Затем выберите компоненты для готового интерфейса или CSearch для собственного сценария.