Модуль поиска в Битрикс автоматически индексирует инфоблоки, форумы и статические файлы.
Но что, если у вас есть данные в своей таблице или динамически генерируемые страницы, которые тоже нужно искать?
Для этого используется событие OnReindex модуля search.
Создание обработчика
Обработчик должен возвращать массив с данными для индексации. Если данных много, нужно поддерживать пошаговую индексацию через переменную $NS.
// init.php
use Bitrix\Main\Loader;
// Регистрируем обработчик
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('search', 'OnReindex', ['MySearchIndexer', 'onReindex']);
class MySearchIndexer
{
public static function onReindex($NS, $oCallback, $callback_method)
{
$arResult = []; // Массив результатов для добавления в индекс
// Если это не первый шаг, восстанавливаем ID последнего элемента
$lastId = intval($NS["ID"]);
// Выбираем данные из своей таблицы (порциями!)
$limit = 100;
$items = \My\CustomTable::getList([
'filter' => ['>ID' => $lastId],
'order' => ['ID' => 'ASC'],
'limit' => $limit
]);
while ($item = $items->fetch()) {
$arResult[] = [
"ID" => "MY_CUSTOM_" . $item['ID'], // Уникальный ID документа в поиске
"LID" => "s1", // ID сайта
"MODULE_ID" => "my.module", // ID вашего модуля
"URL" => "/custom/detail.php?id=" . $item['ID'], // Ссылка на результат
"TITLE" => $item['NAME'], // Заголовок
"BODY" => $item['DESCRIPTION'], // Текст для индексации
"PERMISSIONS" => [2], // Права доступа (2 - все)
"DATE_CHANGE" => $item['DATE_UPDATE'], // Дата изменения
"SITE_ID" => ["s1"]
];
$lastId = $item['ID'];
}
// Если данных нет, возвращаем пустой массив (конец)
if (empty($arResult)) {
return $arResult;
}
// Если данные были, и мы вызываемся из переиндексации (callback),
// нужно вызвать callback и вернуть обновленный $NS
if (!empty($oCallback)) {
$res = call_user_func([$oCallback, $callback_method], $arResult);
if (!$res) {
return $arResult; // Ошибка
}
// Возвращаем состояние для следующего шага
return [
"ID" => $lastId,
"CNT" => count($arResult) // сколько обработали
];
}
return $arResult; // Для обычной работы (обновление 1 элемента)
}
}Как это работает
- Полная переиндексация: Битрикс вызывает OnReindex в цикле. Вы должны вернуть массив $arResult с порцией данных. Если вы вернете массив с ключами ID (состояние), Битрикс вызовет вас снова с этим состоянием в $NS.
- Структура данных:
- ID: Должен быть уникальным в рамках MODULE_ID.
- BODY: Весь текст, по которому будет идти поиск. HTML-теги вырезаются автоматически.
- PERMISSIONS: Массив ID групп пользователей, которым виден этот результат.
Вывод:
Событие OnReindex позволяет «научить» поиск Битрикс видеть любые данные вашего проекта. Главное — правильно реализовать пошаговость, чтобы не превысить лимиты времени выполнения при полной переиндексации.
OnReindex, модуль search, индексация битрикс, поиск по сайту, добавить в поиск, кастомный поиск, NS переменная.