Телеграм: @camouf_ru Почта: mihail@bazarow.ru Заказать разработку проекта

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

Иногда, нужно отключить поиск по описаниям анонсов и детальному описанию товаров, при разработке сайтов на Битрикс. Сделать это можно, воспользовавшись событием "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") ; - поля которые исключаем из индекса

Просмотров: 7564 | Комментариев: 12

Комментарии

Внимание! все сообщения проходят премодерацию. Ваше сообщение появится после проверки
 
Текст сообщения*
Загрузить файл или картинкуПеретащить с помощью Drag'n'drop
Перетащите файлы
Ничего не найдено
Защита от автоматических сообщений
Загрузить файл
Нажимая кнопку "Отправить", Вы принимаете условия
Политики конфиденциальности и обработки персональных данных
Лёнька Щелкунов
Привет Михаил! Подскажи можно ли в область поиска добавить highloadblock? Куда надо копать в этом случае?
Имя Цитировать
Максим Иванов
Скажите, а на текущей версии битиркса это работает? Просто у нас шаблон не на D7. код прописываем http://prntscr.com/gef8n0 поиск по анонсному описанию не отключается.
Имя Цитировать
Михаил Базаров
Цитата
Максим Иванов пишет:
С кажите, а на текущей версии битиркса это работает? Просто у нас шаблон не на D7. код прописываем http://prntscr.com/gef8n0 поиск по анонсному описанию не отключается.
Да, на текущей работает. Попробуйте запустить полную переиндексацию
Имя Цитировать
Инна Жилкина
Спасибо огромное! Это как раз то, что надо!
Имя Цитировать
mt subscribe
не работает
Имя Цитировать
Михаил Базаров
Цитата
mt subscribe пишет:
не работает
Что-то делаете не правильно
Имя Цитировать
mtsub
http://prntscr.com/h3gn9x - в init.php добавил код, http://prntscr.com/h3go80 - сделал переиндексацию. Где ошибка? Не работает - выдает найденное в описании.
Имя Цитировать
Юра Иов
Добрый день! Пытаюсь использовать ваше решение, но положительного результата не добился.
Если вставляю код в файл, который находится в local , то сайт ложится
Если в файл, который находится в bitrix, то после переиндексации поиска нету никаких изменений на странице результатов поиска... могли бы подсказать в чем может быть дело?  
Имя Цитировать
Кирилл Шелег
У меня заработало... тут ID инфоблока надо прописать
+ я продублировал тот же код в папке  bitrix php_interface init.php
Имя Цитировать
Кирилл Шелег
К сожалению через пару месяцев данный скрипт перестал работать. Основные изменения на сайте в это время:перенос на 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 и все заработало
Имя Цитировать
Николай Сухих
Проверено, работает!
Не совсем только понятно почему
Код
// $arFields["BODY"] = str_replace (CSearch::KillTags($arElement[$value]) , "", CSearch::KillTags($arFields["BODY"]) );
// а не  
$arFields["BODY"] = "";
Боимся покалечить индекс который хотим удалить?
Имя Цитировать
Николай Сухих
Цитата
Николай Сухих пишет:
Проверено, работает!
Не совсем только понятно почему
Код
 // $arFields["BODY"] = str_replace (CSearch::KillTags($arElement[$value]) , "", CSearch::KillTags($arFields["BODY"]) );
// а не  
$arFields["BODY"] = ""; 
Боимся покалечить индекс который хотим удалить?
Сам отвечу: Боимся удалить из индекса свойства :)
p.s. Спасибо за статью.
Имя Цитировать
Поделиться страницей Спасибо, это помогает развивать сайт.
Мой youtube канал. C 1-го сентября начнется выход видеокурса по разработке доски объявлений с мобильным приложением.
Перейти на канал Подписывайтесь и будьте в курсе:
Заметки разработчика

Примерно с 2013-го года пишу, короткие и не очень, заметки по разработке сайтов на Битрикс. Возможно, будут полезны кому-то еще. Во всех заметках есть возможность комментирования и обсуждения. Вы можете задавать уточняющие вопросы прямо там- отвечаю или дополняю заметки по возможности.

attention