При работе с поиском на Bitrix часто возникает необходимость ограничить область поиска только заголовками страниц или элементов инфоблоков. Это особенно актуально для больших сайтов, где поиск по полному содержимому может давать избыточные или нерелевантные результаты.
Метод 1: Модификация поискового индекса через BeforeIndex
Самый радикальный, но эффективный способ — изменить сам поисковый индекс, оставив в теле индекса только заголовки.
AddEventHandler("search", "BeforeIndex", "BeforeIndexHandler");
function BeforeIndexHandler($arFields)
{
$arFields["BODY"] = $arFields["TITLE"];
return $arFields;
}Плюсы:
-
Максимальная производительность поиска
-
Не требует дополнительной обработки при поисковых запросах
Минусы:
-
Требует полной переиндексации (Админка → Сервис → Поиск → Переиндексация)
-
Полностью исключает контент страниц из поиска
Метод 2: Фильтрация результатов через OnSearchGetURL
Более гибкий способ — фильтровать результаты поиска уже после выполнения запроса.
AddEventHandler("search", "OnSearchGetURL", "OnSearchGetURLHandler");
function OnSearchGetURLHandler($url, $arr)
{
$searchQuery = $_GET['q'] ?? '';
if(!empty($searchQuery) && stripos($arr['TITLE'], $searchQuery) === false) {
return false; // Исключаем из результатов
}
return $url;
}Плюсы:
-
Не требует переиндексации
-
Позволяет комбинировать поиск по заголовкам и контенту
Минусы:
-
Медленнее первого метода
-
Фильтрация происходит после выполнения поискового запроса
Метод 3: Модификация поискового запроса через OnSearchGetData
Самый правильный с архитектурной точки зрения способ — изменить сам поисковый запрос.
AddEventHandler("search", "OnSearchGetData", "OnSearchGetDataHandler");
function OnSearchGetDataHandler($arParams)
{
if(!empty($_GET['q'])) {
$arParams['QUERY'] = 'TITLE:"'.$_GET['q'].'"';
}
return $arParams;
}Плюсы:
-
Наиболее корректная работа поиска
-
Поддерживает синтаксис поисковых запросов Bitrix
Минусы:
-
Требует точного соответствия (можно использовать TITLE:%поисковый запрос%)
Дополнительные настройки
-
Настройка весов полей (для модуля поиска):
-
Админка → Настройки → Поиск → Правила сортировки
-
Установите вес для поля TITLE в максимальное значение
-
-
Для компонента bitrix:search.page добавьте параметр:
'USE_LANGUAGE_GUESS' => 'N', 'CHECK_DATES' => 'N',
-
Для инфоблоков используйте фильтр:
'FILTER_NAME' => 'arrFilter',
С определением фильтра:
$arrFilter = ['%NAME' => $_GET['q']];
Заключение
Выбор метода зависит от ваших требований:
-
Для максимальной производительности — первый метод
-
Для гибкости — второй метод
-
Для точности — третий метод
Не забудьте после внедрения изменений провести тестирование поиска и при необходимости выполнить переиндексацию.