Фасетный индекс битрикс что это
Перейти к содержимому

Фасетный индекс битрикс что это

  • автор:

Умный фильтр весь такой фасетный и няшный

Умный фильтр показывает отбор товаров по заданным свойствам. Например, искать белый айфон оптимально по бренду «Apple» и цвету «белый». Раньше, обрабатывая запрос, фильтр перебирал все товары каталога. Процесс занимал до 10 секунд и более. Фасета заранее просчитывает и составляет варианты запросов, сохраняет в системе и выдает по запросу. Она в несколько раз сокращает время работы фильтра, снижая нагрузку на ваш магазин.

Устанавливаем обновление

Обновление доступно клиентам и партнерам, которые устанавливают бета-версии обновлений.

Создаем фасетный индекс

После установки обновления система предложит «создать фасетный индекс». На экране появится зеленая плашка, знакомая пользователям нашего продукта:

_023.JPG

Переходим из плашки к созданию индекса. Если вы закрыли данную плашку, и она больше не появляется, найти создание индекса можно по пути:

Рабочий стол -> Контент -> Инфоблоки -> Фасетные индексы

_024.JPG

Выбираете нужный каталог и нажимаете «Создать». В моем случае это два инфоблока, связанных между собой: основной и инфоблок торговых предложений. Создаю индексы для обоих.

Индексы созданы, можно расходиться. При добавлении нового товара в каталог индексы работают автоматически. Вот в чем гениальность реализации от Максима Смирнова — вы нажимаете кнопку, а дальше «все работает само».

Будьте внимательны! Действие для объемных каталогов с большим количеством свойств и элементов может занять продолжительное время. Создавайте фасетный индекс в часы наименьшей нагрузки на ваш магазин.

Умный фильтр 1.0

Дальше в игру вступает визуальная часть, созданная Анной. Нужно произвести некоторые настройки. Давайте посмотрим, как выглядит фильтр после установки дистрибутива 14,5 версии продукта:

_025.JPG

В нем нет фильтрации по размерам и цветам. Они отсутствовали, так как их появление в фильтре могло быть представлено только чек-боксами или числовыми диапазонами — это не эффективно. Также в фильтре не могли использоваться свойства с типом «справочник» (на их основе были сделаны цвета, что еще больше сужало схему выбора).

Красота умного фильтра 2.0

Давайте посмотрим, что появилось в настройке свойств инфоблока:

_026.JPG

В 14,5 версии продукта была только одна галочка «Показывать в умном фильтре». Вы могли или добавить свойство в умный фильтр или не добавлять. Но повлиять на визуальное представление свойства было невозможно.

С 15 версии появилась галочка «Показывать развернутым». При ее выборе свойство отображается в публичной части в развернутом виде:

_027.JPG

На скриншоте свойства «Производитель» и «Артикул» показаны в свернутом виде, свойство «Материал» — в развернутом. (У данного свойства стоит галочка «Показывать развернутым»).

Также появилась возможность выбирать вид отображения свойства:

_028.JPG

_029.JPG

Список меняется в зависимости от выбранного типа у свойства. В первом случае у свойства выбран тип «справочник», во втором «список».

Давайте добавим свойство «Бренд» в умный фильтр:

_030.JPG

Чтобы свойство появилось в умном фильтре, и вы могли задать вид, в котором будет показано свойство необходимо включить опции «Показывать на странице редактирования элемента» и «Показывать в умном фильтре» (установить галочки).

«Выпадашка» — «Вид в умном фильтре» дает возможность (в зависимости от типа свойства) задать, как будет выглядеть ваше свойство в умном фильтре.

Если вы хотите показывать пользователю при входе свойство в развернутом виде, установите галочку напротив «Показать развернутым».

_031.JPG

Фильтр изменился. Мы вывели свойство «Бренд» с типом «Справочник», выбрали его представление в виде «Флажков с названиями и картинками» и установили опцию «Раскрывать свойство при входе пользователя». Свойства «Цвет» и «Размер» тоже хочется видеть в умном фильтре. Не буду показывать на скриншотах, как меняются настройки, покажу результат:

_032.JPG

В виде «выпадашек» я вывел свойства цвета (с картинками и названиями) и размер одежды. Вы можете изменить положение свойства в фильтре(поднять или опустить), меняя их сортировку в списке.

Обратите внимание! Когда вы добавляете или убираете свойство в умном фильтре, необходимо повторно произвести создание фасетного индекса.

Функциональный выбор цен

Хотелось бы обратить ваше внимание на новый вид контрола для цен. Для демонстрации я записал небольшое видео:

  • светло серый – в диапазоне нет подходящих товаров
  • темно серый – цвет показывает сектор наличия товаров в выбранном диапазоне (вы можете сузить диапазон цен)
  • светло синий – товар для отбора находится за диапазоном выбора
  • темно синий – в выбранном диапазоне есть товары

Изменился вид контролов диапазона. В старом фильтре они были круглыми, их нельзя было приближать, и диапазон суммы мог оставался слишком широким. Новые контролы могут сойтись вплотную, регулируя минимальные диапазоны. Также их можно перемещать одновременно.

Приятного вам использования. Не забывайте в комментариях задавать свои вопросы.

Как пересоздать фасетный индекс, если много товаров

В данной статье пойдет речь как создавать фасетный индекс, если товаров очень много. Ну прям настолько много, что переиндексация через админку занимает много времени. Сидеть и ждать с открытым браузером неудобно, а если у вас еще и обмен с 1С, в ходе которого периодически могут прилетать новые свойства – нужно также периодически запускать переиндексацию и ждать, ждать.

Лучший вариант для решения такой задачи – это делегировать переиндексацию фасетов самому серверу.

Для реализации данного способа необходимы навыки разработчика

Я не буду объяснять как искать кусок кода в модуле Битрикса, который отвечает за переиндексацию. А просто приведу уже оттесанный временем исходный код скрипта, который нужно будет повесить на крон на стороне сервера.

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

Итак, листинг кода:

Инструкция на случай «не знаю что дальше делать»:

  1. Создаем файл с данным кодом где-нибудь в папке local или в модуле с классами проекта или по старинке создать в /bitrix/php_interface/cron/.
  2. Заменяем ID инфоблока с товарами.
  3. Вешаем скрипт на крон через консольную команду crontab -e или, если у вас шаред хостинг, через панель управления.

0 0 */7 * * /usr/bin/php -f /home/bitrix/ext_www/test.web-masterok.ga/bitrix/php_interface/cron/reindex.php

Замените путь к файлу на свой. В моем случае скрипт отрабатывает каждую неделю ровно в полночь. Если нужно по-другому – меняем.

Кстати, советую сервис crontab.guru, с помощью которого можно быстро и правильно настроить время отработки скрипта по расписанию.

Недостатки скрипта

В приведенном мною скрипте есть недочет, он принудительно пересоздает фасеты, что не рационально. Но есть решение…

В дальнейшем в другой статье я добавлю листинг класса, который умеет проверять, есть ли потребность в переиндексации фасетного индекса.

Также, не рекомендую устанавливать выполнение фасетов на то время, когда у вас по расписанию выполняется обработка другого скрипта, например, с созданием бекапа на кроне.

Итоги

Такой вот скрипт поможет вам выполнять переиндексацию фасетов для вашего каталога по расписанию. Данный способ особенно актуален, если на сайте десятки-сотни тысячи товаров и периодически добавляются новые свойства.

Новые записи

  • Как авторизоваться в админке без пароля?
  • Аудит сайта на Битрикс. Часть 2. Проверка системы
  • Как снять бекап базы в Битрикс?
  • Подробная статья про функции отладки кода в Битрикс
  • Аудит сайта на Битрикс. Часть 1. Зачем нужен аудит сайта?

Статьи 1С Битрикс | Умный фильтр, бизнес-логика сайта и перестроение фасетного индекса

Умный фильтр, бизнес-логика сайта и перестроение фасетного индекса

Задача

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

Требуется вывести каталог товаров с установленными параметрами фильтрации:

  • Цена товара должна быть больше 0,
  • Показывать только товары у которых есть изображения,
  • Свойство “Показывать на сайте”, которое приходит из 1С должно быть в значении “Да”

Так же на странице со списком элементов требуется разместить компонент умного фильтра.

Решение

На первый взгляд все кажется привычно и просто: размещаем компоненты, передаем нужные ограничения в глобальную переменную, которая передается в компонент в качестве фильтра “FILTER_NAME” и все должно заработать.

Проблема с которой мы сталкнемся при таком подходе — в умном фильтре отображается больше характеристик товара, чем есть товаров в выводе каталога. Связано это с тем, что компонент умного фильтра использует фасетный индекс для обеспечения своей быстрой работы.

Для решения этой проблемы вспомним о том, что индекс строится только по активным товарам, поэтому нам нужно:

  • 1) Деактивировать товары, которые не попадают под условия бизнес-лигики отображения товаров на сайте.
  • 2) Перестроить фасетный индекс с учетом изменений активности товаров
  • 3) Повесить обработчик события “окончания синхронизации с 1С”, выполняющее пункты 1 и 2.
Деактивация товаров

Битрикс не предоставляет ф-ии для группового изменения элементов инфоблока. Есть метод CIBlockElement::Update, который может обновлять данные элементов по ID, для нашей задачи он не подходит, т.к. нам нужно деактивировать несколько тысяч товаров, а при работе этого метода дополнительно вызываются стандартные события Битрикса OnStartIBlockElementUpdate, OnAfterIBlockElementUpdate, что так же замедлит процесс деактивации.

Поэтому мы деактивируем товары прямым запросом к базе данных, используя возможности “нового” ядра D7

/** * Деактивация элементов инфоблок в соответствии с основным фильтром товаров * @param int $iblockId * @param array $arFilter * @return int */ function actualizeProducts($iblockId, $arFilter)  if(!\Bitrix\Main\Loader::includeModule('iblock'))  return false; > $arFilterFinal = [ 'IBLOCK_ID' => $iblockId, $arFilter, ]; // получим список элементов для деактивации $dbRes = CIBlockElement::GetList([], $arFilterFinal, false, false, ['ID']); $arNotValidIds = []; while($arItem = $dbRes->getNext())  $arNotValidIds[] = $arItem['ID']; > $res = 0; if(count($arNotValidIds) > 0)  $strNotValidIds = implode(',', $arNotValidIds); // формируем запрос на обновления флага активности товаров $sql = "UPDATE " . \Bitrix\Iblock\ElementTable::getTableName() . " SET ACTIVE = 'N' WHERE ID IN (" . $strNotValidIds . ")"; $connection = \Bitrix\Main\Application::getConnection(); $connection->queryExecute($sql); // запускаем переиндексацию фасета, это наша кастомная ф-я $res = reindexCatalogFaset($iblockId); > return $res; > 
Пересчет фасетного индекса
/** * @param $iblockId * @return int */ function reindexCatalogFaset($iblockId)  $max_execution_time = 20; // Пересоздание фасетного индекса // Удалим имеющийся индекс Bitrix\Iblock\PropertyIndex\Manager::dropIfExists($iblockId); Bitrix\Iblock\PropertyIndex\Manager::markAsInvalid($iblockId); // Создадим новый индекс $index = Bitrix\Iblock\PropertyIndex\Manager::createIndexer($iblockId); $index->startIndex(); $NS = 0; do  $res = $index->continueIndex($max_execution_time); $NS += $res; > while($res > 0); $index->endIndex(); // чистим кэши \CBitrixComponent::clearComponentCache("bitrix:catalog.smart.filter"); \CIBlock::clearIblockTagCache($iblockId); return $NS; > 
Установка выполнения деактивации и переиндексации на событие завершения обмена с 1С

После каждого обмена файлом с 1С Битрикс вызывает обработку события OnSuccessCatalogImport1C. Обращаем внимание на фразу “после каждого обмена файлом”, т.е. это означает, что если в процессе обмена 1С и Битрикс обменялись 124мя файлами, то и событие OnSuccessCatalogImport1C было вызвано 124 раза.

Такой вариант нас не устраивает, нам нужно знать фактическое окончание обмена с 1С.

Для этого на событие OnSuccessCatalogImport1C повесим установку агента, с интервалом в 5 минут, такой интервал гарантирует нам, что обмен уже завершился, т.к. шаг обмена всегда меньше 5ти минут, а если событие вызовется раньше, то оно перепишет имеющийся агент новым и с новым интервалом выполнения.

Результатом выполнения агента будет создание файла в корне сайта. Этот файл послужит флагом для обработчика в кроне, который и запустит процесс пересоздания фасетного индекса.

В файле /local/php_interface/include/constants.php добавим:

const EXCH_1C_FILE_FLAG_NAME = 'flagExch1CFinished'; 

В файле /local/php_interface/include/handlers.php добавим:

 if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); $eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler("iblock", "OnAfterIBlockElementUpdate", ["CDec1C", "handlerOnAfterIBlockElementUpdate"]); 

Функции в классе обработчике

 class CDec1C  /** * Событие завершения обмена файлом в процессе обмена с 1С */ public function handlerOnSuccessCatalogImport1C($arParams, $fileName)  CAgent::AddAgent('CDec1C::createExch1CFinishFile();', '', 'N', 300); > /** * Создание файла флага завершения обмена с 1С */ public static function createExch1CFinishFile()  $siteRoot = realpath(__DIR__ . '/../../../'); $filePath = $siteRoot . '/' . EXCH_1C_FILE_FLAG_NAME; $fp = fopen($filePath, 'wb'); fwrite($fp, date('Y.m.d H:i:s')); fclose($fp); > > 
Cron файл и добавление задания в crontab

Файлы для добавления в крон будем хранить в папке /local/crons/

создадим файл afterExch1C.php

 $_SERVER["DOCUMENT_ROOT"] = realpath(__DIR__ . '/../../'); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); $filePath = $_SERVER["DOCUMENT_ROOT"] . '/' . EXCH_1C_FILE_FLAG_NAME; if (!file_exists($filePath))  return; > // сразу удалим файл, что бы не запуститься более 1ого раза unlink($filePath); $arFilter = CCommon::CATALOG_MAIN_FILTER_NOTVALID; echo "индекс пересоздан " . CCommon::actualizeProducts(IBID_CATALOG, $arFilter) . "\n"; ?> 

Добавим задание в крон. Интервал выполнения проверки — каждые 5 минут.

Открываем файл заданий крона на изменение

crontab -e 

Добавляем наше задание

*/5 * * * * /local/crons/afterExch1C.php # на событие окончания обмена с 1С, выполняется КАЖДЫЕ 5 минут 

Фасетный индекс битрикс что это

Нашли ошибку? Выделите мышкой и нажмите Ctrl+Enter

Фасетные индексы

Фасетные индексы ускоряют работу умного фильтра. Обычно умному фильтру нужно перебрать все товары каталога и сравнить их свойства с заданными параметрами. Если товаров много, такой процесс может занять определенное время. Фасета же заранее просчитывает и составляет варианты запросов, сохраняет в системе и выдает по запросу.

Одному каталогу соответствует один фасетный индекс. Он нужен для того, чтобы поиск по каталогу осуществлялся максимально быстро. После того, как вы внесли изменения в настройки умного фильтра, проверьте состояние фасетных индексов (особенно если заметили, что внесенные вами изменения не отобразились).

В административном разделе перейдите в Рабочий стол → Контент → Инфоблоки Фасетные индексы

Если состояние индекса «Работает» и горит зеленый индикатор, то все в порядке. Если же индикатор красный и появилась кнопка «Создать», то нажмите «гамбургер» и выберите соответствующий пункт.

В списке «Информационный блок» выберите «Каталог товаров». В поле «Шаг» можете оставить значение по умолчанию.

Вы можете при необходимости отключить фасетный индекс, но делать это не рекомендуется.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *