Фасетные индексы инфоблоков

Создаем фасетный индекс пошагово

Еще с 15 версии добавлен фасетный  поиск по товарам торгового каталога. Система формирует фасеты (всевозможные комбинации пересечения свойств товаров) и при выполнении поискового запроса мгновенно выдается результат. Так же, использование фасетного индекса встроено в информационные блоки и интегрировано с компонентом «Умный фильтр».

Дополнительно создание фасетных индексов ускоряет не только поиск товаров, но и работу всего каталога в целом. Но есть нюанс — на большой каталоге  во много десятков тысяч товаров индексирование фасетов может создавать чрезмерную нагрузку и «рушить» сервер.

Проблема решается добавлением пошаговости в данный процесс:

define(‘NO_KEEP_STATISTIC’, true); define(‘NOT_CHECK_PERMISSIONS’, true); require($_SERVER[‘DOCUMENT_ROOT’] . ‘/bitrix/modules/main/include/prolog_before.php’); use \Bitrix\Main\Loader; use \Bitrix\Main\Diag\Debug; Loader::includeModule(‘iblock’); // убираем ограничением время выполнения php скрипта set_time_limit(0); // задаем максимально разрешенный к использованию объем памяти ini_set(‘memory_limit’,’512M’); // длина одного шага в секундах (чем меньше — тем меньше нагрузка, но дольше будет идти переиндексация фасетов) $stepTimeLimit = 10;

$productsIndexedCount = 0; // Получим ID инфоблоков, для которых используется фасетный индекс $iblockList = \Bitrix\Iblock\IblockTable::getList(array( ‘select’ => array(‘ID’), ‘filter’ => array(‘=PROPERTY_INDEX’ => ‘I’), ))->fetchAll(); if (empty($iblockList)) { Debug::writeToFile(date(‘r’) . ‘Iblocks for reindex of facets are not detected.’); exit(); } foreach ($iblockList as $iblock) { $index = \Bitrix\Iblock\PropertyIndex\Manager::createIndexer($iblock[‘ID’]); $index->startIndex(); $stepNumber = 1; $productsIndexedInLastStepCount = 0; $productsLimitCount = $index->estimateElementCount(); Debug::writeToFile ( date(‘r’) . ‘ start reindexing of facets for iblock: ‘ . $iblock[‘ID’] . ‘. ‘ . ‘Found products for index: ‘ . $productsLimitCount ); while ($productsIndexedCount <= $productsLimitCount) { $productsIndexedCount = $index->continueIndex($stepTimeLimit) + $productsIndexedCount; if ($stepNumber > 1 && ($productsIndexedInLastStepCount == $productsIndexedCount)) { break; } Debug::writeToFile (‘current step: ‘ . $stepNumber . ‘; products indexed count: ‘ . $productsIndexedCount); $stepNumber++; $productsIndexedInLastStepCount = $productsIndexedCount; } if ($productsIndexedCount >= $productsLimitCount) { $index->endIndex(); } Debug::writeToFile ( date(‘r’) . ‘ stop reindexing of facets for iblock ‘ . $iblock[‘ID’] . ‘. ‘ .

Требования

‘Memory is used: ‘ . round(memory_get_usage() / 1024 / 1024, 2) . ‘MB’ ); } \Bitrix\Iblock\PropertyIndex\Manager::checkAdminNotification();

Рейтинг

Возврат к списку

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

Работа с фасетными индексами по API

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

Вмешаться в работу скрипта обновления никак нельзя. Поэтому понадобилось повесить на cron пересоздание фасетных индексов для инфоблока товаров.

Ранее я этого никогда не делал, поэтому полез в гугл за информацией. В итоге нашел все, что мне нужно. Привожу копию со ссылкой на источник.

Чтобы отключить (удалить) фасетный индекс, выполните этот код в консоли PHP:

Пересоздать фасетный индекс через API:
Для элемента:

Для инфоблока:

Источник: https://webdevhelp.ru/solutions/facet-index/

Меня зовут Иван Милов, мне 22 года. Опыт работы с Битрикс: 4 года. Кроме этого работал с такими CMS, как Datalife Engine, WordPress, Joomla, OpenCart, Simpla и другими. Есть опыт парсинга и наполнения сайтов товарами и другими данными.
© Блог Милова Ивана, 2017

1С-Битрикс: Управление сайтом 15.0

Как отключить фасетный индекс и другие проблемы

  1. Чтобы отключить (удалить) фасетный индекс, выполните этот код в консоли PHP
    CModule::IncludeModule(‘iblock’); 
    Bitrix\Iblock\PropertyIndex\Manager::DeleteIndex($iblockId); 
    Bitrix\Iblock\PropertyIndex\Manager::markAsInvalid($iblockId);
  2. Чтобы вызвать переиндексацию фасеты
    • Магазин → Каталог товаров → [Ваш каталог] → Настройка каталога → Свойства элементов
    • Добавляем (можно убрать) любое свойство в умный фильтр и индекс сбрасывается
  3. Пересоздать фасетный индекс через API
    • Для элемента
      \Bitrix\Iblock\PropertyIndex\Manager::updateElementIndex(ID_инфоблока, ID_элемента);
    • Для инфоблока
      $index = \Bitrix\Iblock\PropertyIndex\Manager::createIndexer(ID_инфоблока); $index->startIndex(); $index->continueIndex(0); // создание без ограничения по времени $index->endIndex();

Не понятно или не получается? Обратитесь к онлайн-консультанту.

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

Закрыть меню