Перейти к содержимому


Аналоги (похожие товары)


  • Вы не можете ответить в тему
Сообщений в теме: 59

#21 micehide

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 359 сообщений
Репутация: 124
Мастер

Отправлено 23 February 2012 - 11:52 PM

ммм... почитал, а у тебя-то тоже в коде не кэширует запрос из-за ORDER by RAND(NOW())
  • 0

#22 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 23 February 2012 - 11:57 PM

кстати, посмотри кол-во запросов из базы для product_detailed, у меня их 69

у меня их 130 )) (оптимизацию я не ставил)

---------- Сообщение объединено ----------

ORDER by RAND(NOW())

а я писал что это зло )) просто при его отсутвии в будут выводится первые попавшиеся 4 товара
  • 0
Изображение Изображение Изображение

#23 micehide

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 359 сообщений
Репутация: 124
Мастер

Отправлено 23 February 2012 - 11:58 PM

у меня их 130 )) (оптимизацию я не ставил)

Ого, я тоже не ставил ))))) я просто удалил половину кода, генерируемого для product_detailed )))) мне он показался лишним ))))

а я писал что это зло )) просто при его отсутвии в будут выводится первые попавшиеся 4 товара

Мдя, короче выбираем из двух зол наименьшее ))))
  • 0

#24 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 24 February 2012 - 12:01 AM

Мдя, короче выбираем из двух зол наименьшее ))))

не согласен, буду думать дальше

UPD: смотрим в строну функции shuffle, после запроса, но уже завтра
  • 0
Изображение Изображение Изображение

#25 micehide

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 359 сообщений
Репутация: 124
Мастер

Отправлено 24 February 2012 - 02:11 AM

Измеил код в соответствие с последними наработками, стало так:
Обработка данных: 0.247 сек
Компиляция шаблона: 0.385 сек
Работа с БД: 0.022 сек
Общее время работы: 0.653 сек
Запросов в БД: 65

  • 0

#26 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 24 February 2012 - 11:55 AM

Измеил код в соответствие с последними наработками, стало так:

Обработка данных: 0.247 сек
Компиляция шаблона: 0.385 сек
Работа с БД: 0.022 сек
Общее время работы: 0.653 сек
Запросов в БД: 65


змечания:
вот это
 $result_similar = array_slice($result_similar, 0, $num);

изменить на
if ($counter > $cifra) break;


и поставить чуть выше
потому как, в твоем случае идет полная обработка цикла (а что будет, если масив примерно на 16000 товаров), а ее можно сократить, до нужного количества записей, и тем самым снизить нагрузку

---------- Сообщение объединено ----------

как окончательный(надеюсь) вариант

       function translit($str) 
{
$tr = array(
"А"=>"a","Б"=>"b","В"=>"v","Г"=>"g","Д"=>"d","Е"=>"e","Ж"=>"j","З"=>"z","И"=>"i","Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
"О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t","У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"ts","Ч"=>"ch","Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"yi","Ь"=>"",
"Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b","в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j","з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r","с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h","ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
"ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"," "=> "_","."=> "",","=> "","/"=> "_","’"=> "","°"=> "","+"=> "_");
return strtr($str,$tr);
}

function sort_explode_callback($delimiter,$array_string)
{
$arr = explode($delimiter,$array_string);
sort($arr);
return $arr;
}


$cifra = 4; //количество последних товаров для выбора
$percent = 70;
$counter = 0;
$explode_char = ",";
$result_similar = array();

$search_for_similar_meta_tags = db_fetch_assoc(db_query("SELECT meta_description,meta_keywords FROM ".PRODUCTS_TABLE." WHERE productID=".$productID.""));

$similar_meta_tags = db_query("select s.productID, s.name, s.Price, s.enabled, s.meta_description, s.meta_keywords, t.filename FROM ".PRODUCTS_TABLE." AS s LEFT JOIN ".PRODUCT_PICTURES."
AS t on (s.default_picture=t.photoID AND s.productID=t.productID) WHERE s.categoryID!=1 AND s.enabled=1 AND s.productID!=".$productID."");

while ($row = db_fetch_row($similar_meta_tags))
{
$artig_shuffled[] = $row;
}

shuffle($artig_shuffled);

foreach ( $artig_shuffled as $row )
{
similar_text(metaphone(translit(serialize(sort_explode_callback($explode_char,$search_for_similar_meta_tags["meta_keywords"])))),metaphone(translit(serialize(sort_explode_callback($explode_char,$row["meta_keywords"])))),$sim);
if ($sim > $percent )
{
$counter += 1;
if ($counter > $cifra) break;
if (strlen($row["filename"])>0 && file_exists( "data/small/".$row["filename"])){
$row["filename"] = "small/".$row["filename"];
$row["cena"] = $row["Price"];
$row["Price"] = show_price($row["Price"]);
$result_similar[] = $row;

}else{
$row["filename"] = "empty.gif";
$row["cena"] = $row["Price"];
$row["Price"] = show_price($row["Price"]);
$result_similar[] = $row;
}
}
}
$smarty->assign("similar_products", $result_similar);


время выполнения:
предыдущий вариант - 0.01606297492981
текущий при использовании shuffle - 0.015450954437256

и это при количестве товаров около 100, при 1000 и выше прирост будет намного больше
  • 0
Изображение Изображение Изображение

#27 micehide

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 359 сообщений
Репутация: 124
Мастер

Отправлено 25 February 2012 - 08:25 PM

Поменял код в шапке на окончательный (от eugene_web), протестировал у себя на тестовом сервере (650 товаров), время выполнения не изменилось. Код стабильный и простой, можно спокойно пользоваться.

Из желательных апдейтов (на будущее):
  • Добавить опциональную возможность при импорте товаров автоматически генерировать meta_keywords из содержания указанных доп. характеристик;
  • Реализовать возможность осуществления выборки аналогов только из определенных категорий товаров (чтобы, например, при выборе холодильника не вылезали моб. телефоны в качестве аналогов).

  • 0

#28 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 25 February 2012 - 09:20 PM

еще один маленький нюанс

round($sim)

зачем округлять?
  • 0
Изображение Изображение Изображение

#29 micehide

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 359 сообщений
Репутация: 124
Мастер

Отправлено 26 February 2012 - 12:09 AM

зачем округлять?

убрал...
  • 0

#30 Den

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 117 сообщений
Репутация: 0
Начинающий

Отправлено 28 February 2012 - 05:43 PM

Господа-разработчики, подскажите, неужели этот блок динамически генерирует похожие товары при каждом открытии страницы с товаром или я что-то неправильно понял? Мне казалось, что разрабатывался модуль, который позволял бы через админку нажатием неск. кнопок сгенерировать для определенных товаров аналоги, которые бы хранились в базе и выводились в стандартном блоке "Рекомендуемые товары"....
  • 0

#31 micehide

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 359 сообщений
Репутация: 124
Мастер

Отправлено 29 February 2012 - 12:06 AM

Господа-разработчики, подскажите, неужели этот блок динамически генерирует похожие товары при каждом открытии страницы с товаром или я что-то неправильно понял?

Да, именно так...

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

Ну, гмм... зачем разрабатывать то, что требует каких-то действий от менеджера магазина, если можно сделать автоматический вывод аналогов, без трудозатрат со стороны персонала... автоматизация, сэр!
  • 0

#32 Den

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 117 сообщений
Репутация: 0
Начинающий

Отправлено 29 February 2012 - 06:03 PM

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

Тогда это просто замечательно!!! А как обстоят дела с нагрузкой на сервер? Если скажем на сайте человек 50 ходит при 1000 товарах в базе? Виртуальный хостинг потянет?

И все же лично мне не очень нравится эта идея с переносом значений характеристик в кейвордс. К примеру, если характеристики состоят в основном из цифровых значений и есть/нет, да/нет, будет ли модуль адекватно находить схожие товары?
  • 0

#33 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 29 February 2012 - 06:15 PM

Тогда это просто замечательно!!! А как обстоят дела с нагрузкой на сервер? Если скажем на сайте человек 50 ходит при 1000 товарах в базе? Виртуальный хостинг потянет?

с нагрузкой все нормально, работает достаточно шустро, по крайней мере при одновременном просмотре 50 человек все нормально

И все же лично мне не очень нравится эта идея с переносом значений характеристик в кейвордс. К примеру, если характеристики состоят в основном из цифровых значений и есть/нет, да/нет, будет ли модуль адекватно находить схожие товары?


у Вас все равно будет писаться формулировка "характеристика :(или -) да/нет", и поэтому все будет адекватно
  • 0
Изображение Изображение Изображение

#34 micehide

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 359 сообщений
Репутация: 124
Мастер

Отправлено 01 March 2012 - 12:06 AM

На самом деле проще всего наполнять meta_keywords при составлении изначального CSV-файла для импорта, т.к. функциональности Excel-я более чем достаточно для этого, с другой стороны, если потом, скажем, кто-то добавит характеристику через редактирование товара в Админке, то это не будет учтено автоматически в meta_keywords. Но жертва эта небольшая, т.к. само по себе редактирование в Админке достаточно неудобно и, в любом случае, можно заставить этого "кого-то" еще и вписать руками эту хар-ку в meta_keywords в Админке...

Конечно, meta_keywords сейчас мало учитываются (или вообще не учитываются) поисковиками, но все же удобно там иметь список характеристик товара поименно. Думаю, в контексте всего объема информации на странице, релевантное содержание meta_keywords будет иметь какой-то дополнительный вес для поисковиков.

у Вас все равно будет писаться формулировка "характеристика или -) да/нет", и поэтому все будет адекватно

Ага, главное соблюсти еще правильную последовательность этих "да да нет да", тогда все будет зашибись )))
  • 0

#35 Den

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 117 сообщений
Репутация: 0
Начинающий

Отправлено 01 March 2012 - 10:42 AM

у Вас все равно будет писаться формулировка "характеристика или -) да/нет", и поэтому все будет адекватно

Не вдавался в тонкости выбранных алгоритмов сопоставления текста, однако, как мне кажется, в данном примере не все будет гладко:

"Диагональ:46" и "Диагональ:26" - совершенно разные телевизоры, но разница всего в 1 символ - соответствие сильное - модуль может выбрать в кач-ве аналога
"Высота:195" и Высота:200" - аналогичные холодильники, однако отличие уже целых 3 символа....

Или алгоритм работает как-то иначе?
  • 0

#36 dorian

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 107 сообщений
Репутация: 24
Ассистент

Отправлено 05 March 2012 - 06:11 PM

зачем так все усложнять? зачем дополнительные характеристики? если чел покупает телевизор (keywords: телевизор, самсунг, samsung, UE-32D4010)
есть в магазине подставки под телевизор (keywords: подставка, телевизор)

совпали в мета-кейвордс слова "телевизор" - и при просмотре страницы product_detalied телевизора, ему магазин предложит купить еще и подставку

а выборку товаров делать mysql запросом с ключом LIKE %meta_keyword%
  • 0

#37 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 05 March 2012 - 06:37 PM

зачем так все усложнять? зачем дополнительные характеристики? если чел покупает телевизор (keywords: телевизор, самсунг, samsung, UE-32D4010)
есть в магазине подставки под телевизор (keywords: подставка, телевизор)

Вы путаете "аналогичные товары" и "сопутствующие товары", а ведь эти два множества даже не являются пересекающимися. См. название темы :).

---------- Сообщение объединено ----------

"Диагональ:46" и "Диагональ:26" - совершенно разные телевизоры, но разница всего в 1 символ - соответствие сильное - модуль может выбрать в кач-ве аналога

И это будет совершенно правильно. Т.к. если надо выбрать пять аналогов "Диагональ:46" и они есть, то будут выбраны они, как более близкие. А если нет, то наиболее близкими будут "Диагональ:32". Нет и их - тогда "Диагональ:26". Это ж аналоги не из общемирового списка телевизоров, а ближайшие из тех, что есть в базе :).

PS. Понятно, что правильнее было бы еще и разные весовые коэффициенты у разных характеристик задавать, но вот нет их штатно, что ж делать...
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#38 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 01 April 2012 - 03:24 PM

А зачем в каждом витке цикла выполнять metaphone(translit(serialize(sort_explode_callback($explode_char,$cur_keywords))))
ведь оба входных параметра известны до начала цикла и неизменны?

  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#39 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 01 April 2012 - 03:57 PM

Опс! Ошибочку нашел: надо t.filename вместо s.filename в SQL-запросе :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#40 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 01 April 2012 - 04:29 PM

Опс! Ошибочку нашел: надо t.filename вместо s.filename в SQL-запросе

так вобщем то на 14 поста выше так и написано, плохо смотрел:)

P.S. просто micehide мою реализацию не полностью поднял в шапку ))
  • 0
Изображение Изображение Изображение