Отключить поиск по описаниям товаров в Битрикс

Просмотров: 14201

Иногда, нужно отключить поиск по описаниям анонсов и детальному описанию товаров, при разработке сайтов на Битрикс. Сделать это можно, воспользовавшись событием "BeforeIndex" который вызывается перед индексацией элемента методом CSearch::Index.

Для чего отключать поиск по описаниям товаров в Битрикс

Например: У вас очень большой каталог товаров, у каждого товара заполнено детальное описание, с большими объемами текста. При попытке поиска по каталогу, стандартным компонентом "Поиск по каталогу", есть вероятность, что начнут выдаваться не релевантные запросу результаты. Так как будет осуществлена попытка полнотекстового поиска по всему содержимому

Добавляем обработчик BeforeIndex

В директории /local/ создаем директорию php_interface и в ней файл init.php, в котором и описываем функцию-обработчик. Данная функция сработает при попытке переиндексации элементов модулем поиска и исключит описания анонсов и детальные описания из индекса.

AddEventHandler("search", "BeforeIndex", "BeforeIndexHandler");
function BeforeIndexHandler($arFields)
{
    $arrIblock = array(48);
    $arDelFields = array(
        "DETAIL_TEXT",
        "PREVIEW_TEXT"
    );
    if (
        CModule::IncludeModule('iblock')
        && $arFields["MODULE_ID"] == 'iblock'
        && in_array($arFields["PARAM2"], $arrIblock)
        && intval($arFields["ITEM_ID"]) > 0
    ) {
        $dbElement = CIblockElement::GetByID($arFields["ITEM_ID"]);
        if ($arElement = $dbElement->Fetch()) {
            foreach ($arDelFields as $value) {
                if (isset ($arElement[$value]) && strlen($arElement[$value]) > 0) {
                    $arFields["BODY"] = str_replace(CSearch::KillTags($arElement[$value]), "", CSearch::KillTags($arFields["BODY"]));
                }
            }
        }
        return $arFields;
    }
}

Где:
$arrIblock = array(48); - индетификатор инфоблока каталога
$arDelFields = array("DETAIL_TEXT", "PREVIEW_TEXT") ; - поля которые исключаем из индекса

mt subscribe 24.10.2017
не работает
Михаил Базаров 25.10.2017
Цитата
mt subscribe пишет:
не работает
Что-то делаете не правильно
mtsub 29.10.2017
http://prntscr.com/h3gn9x - в init.php добавил код, http://prntscr.com/h3go80 - сделал переиндексацию. Где ошибка? Не работает - выдает найденное в описании.
Юра Иов 23.01.2018
Добрый день! Пытаюсь использовать ваше решение, но положительного результата не добился.
Если вставляю код в файл, который находится в local , то сайт ложится
Если в файл, который находится в bitrix, то после переиндексации поиска нету никаких изменений на странице результатов поиска... могли бы подсказать в чем может быть дело?  
Кирилл Шелег 04.04.2018
У меня заработало... тут ID инфоблока надо прописать
+ я продублировал тот же код в папке  bitrix php_interface init.php
Кирилл Шелег 13.08.2018
К сожалению через пару месяцев данный скрипт перестал работать. Основные изменения на сайте в это время:перенос на VPS настройка агентов на cron ну и так по мелочи.... не знаю из за чего данный скрипт перестал работать....
Полазив по форумам удалось найти вот такой скрипт


AddEventHandler("search", "BeforeIndex", array("SearchHandlers", "BeforeIndexHandler"));

class SearchHandlers
{
  function BeforeIndexHandler($arFields)
  {
     if($arFields["MODULE_ID"] == "iblock")
     {
        if(array_key_exists("BODY", $arFields) && substr($arFields["ITEM_ID"], 0, 1) != "S") // Только для элементов
        {
           $arFields["BODY"] = "";
        }

        if (substr($arFields["ITEM_ID"], 0, 1) == "S") // Только для разделов
        {
           $arFields['TITLE'] = "";
           $arFields["BODY"] = "";
           $arFields['TAGS'] = "";
        }
     }

     return $arFields;
  }
}

Установил его в  bitrix php_interface init.php и все заработало
Николай Сухих 16.11.2018
Проверено, работает!
Не совсем только понятно почему
Код
// $arFields["BODY"] = str_replace (CSearch::KillTags($arElement[$value]) , "", CSearch::KillTags($arFields["BODY"]) );
// а не  
$arFields["BODY"] = "";
Боимся покалечить индекс который хотим удалить?
Николай Сухих 16.11.2018
Цитата
Николай Сухих пишет:
Проверено, работает!
Не совсем только понятно почему
Код
 // $arFields["BODY"] = str_replace (CSearch::KillTags($arElement[$value]) , "", CSearch::KillTags($arFields["BODY"]) );
// а не  
$arFields["BODY"] = ""; 
Боимся покалечить индекс который хотим удалить?
Сам отвечу: Боимся удалить из индекса свойства :)
p.s. Спасибо за статью.
Андрей 15.07.2022
Все работает, нужно сделать полную переиндексацию (cнять галочку "Переиндексировать только измененные"). Ну и если есть свой модуль, то в него запихнуть, а не в init.php
Гость 19.12.2022
Этот скрипт не работает, если в описании встречаются пробелы  .
В таком случае нужно дополнительно вырезать такие символы из описаний.