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

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

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

Итак, для начала разберем слова из названия и поисковых тегов текущего товара. Для этого, в файле 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'])).'%';

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

Количество показов: 5019
28.02.2016

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

Если вам была полезна статья можете отблагодарить автора:
Ethereum:

0x16Df809287333C49D3A237296C6248A6c08702Bc

Разработка сайта

Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...

Сопровождение сайта

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

Работы по сайту

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