Блог Горошко Андрея 1C-Битрикс Кастомный поиск: Индексация своих данных через событие OnReindex

Кастомный поиск: Индексация своих данных через событие OnReindex

Средний рейтинг
Еще нет оценок

Модуль поиска в Битрикс автоматически индексирует инфоблоки, форумы и статические файлы.

Но что, если у вас есть данные в своей таблице или динамически генерируемые страницы, которые тоже нужно искать?

Для этого используется событие 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 элемента)
    }
}

Как это работает

  1. Полная переиндексация: Битрикс вызывает OnReindex в цикле. Вы должны вернуть массив $arResult с порцией данных. Если вы вернете массив с ключами ID (состояние), Битрикс вызовет вас снова с этим состоянием в $NS.
  2. Структура данных:
    • ID: Должен быть уникальным в рамках MODULE_ID.
    • BODY: Весь текст, по которому будет идти поиск. HTML-теги вырезаются автоматически.
    • PERMISSIONS: Массив ID групп пользователей, которым виден этот результат.

Вывод:
Событие OnReindex позволяет «научить» поиск Битрикс видеть любые данные вашего проекта. Главное — правильно реализовать пошаговость, чтобы не превысить лимиты времени выполнения при полной переиндексации.

OnReindex, модуль search, индексация битрикс, поиск по сайту, добавить в поиск, кастомный поиск, NS переменная.

Мой рейтинг:

Добавить комментарий

Related Post

Свойство «Справочник» (Highload-блок): Как получить данные по UF_XML_IDСвойство «Справочник» (Highload-блок): Как получить данные по UF_XML_ID

Средний рейтинг Еще нет оценок Свойство типа «Справочник» (directory) — это современный аналог списков. Оно хранит данные в Highload-блоке, что позволяет добавлять к значениям картинки и дополнительные поля. Проблема: При выборке

Свойства элементов Битрикс: Работа со Списком, Файлом и ПривязкойСвойства элементов Битрикс: Работа со Списком, Файлом и Привязкой

Средний рейтинг Еще нет оценок При добавлении или обновлении элементов через API (CIBlockElement::Add/Update) работа с простыми свойствами (строка, число) интуитивно понятна. Однако сложные типы, такие как «Список», «Файл» и «Привязка

Система событий в Битрикс: AddEventHandler и современный EventManager из D7Система событий в Битрикс: AddEventHandler и современный EventManager из D7

Средний рейтинг Еще нет оценок Система событий — один из самых мощных механизмов в 1С-Битрикс. Она позволяет «вклиниваться» в стандартные процессы (например, перед добавлением товара в корзину или после обновления