Иногда, нужно отключить поиск по описаниям анонсов и детальному описанию товаров, при разработке сайтов на Битрикс. Сделать это можно, воспользовавшись событием "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 пишет: не работает |
Если вставляю код в файл, который находится в local , то сайт ложится
Если в файл, который находится в bitrix, то после переиндексации поиска нету никаких изменений на странице результатов поиска... могли бы подсказать в чем может быть дело?
+ я продублировал тот же код в папке bitrix php_interface init.php
Полазив по форумам удалось найти вот такой скрипт
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"] = ""; |
Цитата | ||
---|---|---|
Николай Сухих пишет: Проверено, работает! Не совсем только понятно почему
|
p.s. Спасибо за статью.
В таком случае нужно дополнительно вырезать такие символы из описаний.