Поиск похожих товаров

Поиск похожих товаров

1722
28.02.2016
11.07.2018

Ранее писал уже статью про поиск похожих статей, но тот код был слишком примитивым. В этом посте - ремейк строго алгоритма.

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

Итак, для начала разберем слова из названия и поисковых тегов текущего товара. Для этого, в файле component_epilog.php разбираем слова:

$words1 = preg_split('#[0-9\W_]+#u', htmlspecialchars_decode($arResult['NAME']));
$words2 = preg_split('#[0-9\W_]+#u', htmlspecialchars_decode($arResult['TAGS']));

$words = array('LOGIC' => 'OR');
foreach (array_merge($words1, $words2) as $word) {
    $word = htmlspecialchars_decode($word);
    $word = trim($word);
    if (strlen($word) > 2) {
        $words[] = array('NAME' => '%' . $word . '%');
        $words[] = array('TAGS' => '%' . $word . '%');
    }
}

Таким образом, в массиве $words хранится набор слов (длинной более 2 символов), подготовленных для поиска по названиям товаров или по поисковым тегам товаров.

Помещаем данный подготовленный массив в глобальный массив фильтра:

$GLOBALS['SIMILAR_PRODUCTS'] = array($words);

Этот массив прописываем в параметр FILTER_NAME компонента catalog.section:

$APPLICATION->IncludeComponent(
    "bitrix:catalog.section",
    "template_name",
    array(
        ...
        "FILTER_NAME" => 'SIMILAR_PRODUCTS',
        ...
    ),
    false
);

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

Update 2018-07-11.

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

Конечно, такой вариант имеет смысл только тогда, когда ваши товары максимально описываются различными свойствами.

Логика такого алгоритма состоит из отбора ключевых свойст, по которым будем искать похожие товары (свойства, которые не уникальны для того или иного типа товара в тот список включать, конечно же не стоит). Например, если у вас на сайте продаются канцтовары - то идеальным решением выделения в список свойств будут свойства, описывающие сколько листов бумаги в пачке, количество цвтов в коробке с карандашами, плотность бумаги и т.п. При этом, включать в данный список свойство "Цвет" не стоит - у вас могут быть цветные ручки с свойством "цвет", бумага со свойством "цвет", корзины для мусора с тем же самым свойством "Цвет" и будет глупо выводить в качестве похожего для цветной бумаги цветные фломастеры (например, по свойству "Количество цвтов в наборе").

Итак, мы выбрали набор свойств. В файле result_modifier.php компонента, выводящего карточку товара, проверяем, какие из выбранных свойств заполнены у текущего товара:

$looksLikeProps = array();
foreach ($checkProps as $pcode)
{
	if(strlen($arResult['PROPERTIES'][$pcode]['VALUE'])>0){
		$looksLikeProps[$pcode] = $arResult['PROPERTIES'][$pcode]['VALUE'];
	}
}

В результате, получим массив с набором свойство-значение - этого тостаточно для передачи в catalog.section.

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

$arrFilter['NAME'] = current(explode(' ',$arResult['NAME'])).'%';

Все! Остается скормить это все в комопнент, выводящий список товаров (смотрите по ситуации - выводить все свойство с логикой "И", либо группировать свойство с "И"-"ИЛИ").



Благодарю за внимание! Делитесь вашими замечаниями в комментариях ниже.


P.S. Обращайтесь ко мне за приобретением лицензий и продлений на 1C-Битрикс "Управление сайтом", лицензий на облачную и коробочную версии Битрикс 24 а также за приобретением и внедрением готовых решений на базе 1С-Битрикс от партнеров. За более подробной информацией свяжитесь со мной любым удобным для вас способом


Комментарии

Еще никто не комментировал данную публикацию. Будьте первыми!

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

captcha

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