Аналоги (похожие товары)
#21
Отправлено 23 February 2012 - 11:52 PM
#22
Отправлено 23 February 2012 - 11:57 PM
у меня их 130 )) (оптимизацию я не ставил)кстати, посмотри кол-во запросов из базы для product_detailed, у меня их 69
---------- Сообщение объединено ----------
а я писал что это зло )) просто при его отсутвии в будут выводится первые попавшиеся 4 товараORDER by RAND(NOW())
#23
Отправлено 23 February 2012 - 11:58 PM
Ого, я тоже не ставил ))))) я просто удалил половину кода, генерируемого для product_detailed )))) мне он показался лишним ))))у меня их 130 )) (оптимизацию я не ставил)
Мдя, короче выбираем из двух зол наименьшее ))))а я писал что это зло )) просто при его отсутвии в будут выводится первые попавшиеся 4 товара
#25
Отправлено 24 February 2012 - 02:11 AM
Обработка данных: 0.247 сек
Компиляция шаблона: 0.385 сек
Работа с БД: 0.022 сек
Общее время работы: 0.653 сек
Запросов в БД: 65
#26
Отправлено 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 и выше прирост будет намного больше
#27
Отправлено 25 February 2012 - 08:25 PM
Из желательных апдейтов (на будущее):
- Добавить опциональную возможность при импорте товаров автоматически генерировать meta_keywords из содержания указанных доп. характеристик;
- Реализовать возможность осуществления выборки аналогов только из определенных категорий товаров (чтобы, например, при выборе холодильника не вылезали моб. телефоны в качестве аналогов).
#29
Отправлено 26 February 2012 - 12:09 AM
убрал...зачем округлять?
#30
Отправлено 28 February 2012 - 05:43 PM
#31
Отправлено 29 February 2012 - 12:06 AM
Да, именно так...Господа-разработчики, подскажите, неужели этот блок динамически генерирует похожие товары при каждом открытии страницы с товаром или я что-то неправильно понял?
Ну, гмм... зачем разрабатывать то, что требует каких-то действий от менеджера магазина, если можно сделать автоматический вывод аналогов, без трудозатрат со стороны персонала... автоматизация, сэр!Мне казалось, что разрабатывался модуль, который позволял бы через админку нажатием неск. кнопок сгенерировать для определенных товаров аналоги, которые бы хранились в базе и выводились в стандартном блоке "Рекомендуемые товары"
#32
Отправлено 29 February 2012 - 06:03 PM
Тогда это просто замечательно!!! А как обстоят дела с нагрузкой на сервер? Если скажем на сайте человек 50 ходит при 1000 товарах в базе? Виртуальный хостинг потянет?Ну, гмм... зачем разрабатывать то, что требует каких-то действий от менеджера магазина, если можно сделать автоматический вывод аналогов, без трудозатрат со стороны персонала... автоматизация, сэр!
И все же лично мне не очень нравится эта идея с переносом значений характеристик в кейвордс. К примеру, если характеристики состоят в основном из цифровых значений и есть/нет, да/нет, будет ли модуль адекватно находить схожие товары?
#33
Отправлено 29 February 2012 - 06:15 PM
с нагрузкой все нормально, работает достаточно шустро, по крайней мере при одновременном просмотре 50 человек все нормальноТогда это просто замечательно!!! А как обстоят дела с нагрузкой на сервер? Если скажем на сайте человек 50 ходит при 1000 товарах в базе? Виртуальный хостинг потянет?
И все же лично мне не очень нравится эта идея с переносом значений характеристик в кейвордс. К примеру, если характеристики состоят в основном из цифровых значений и есть/нет, да/нет, будет ли модуль адекватно находить схожие товары?
у Вас все равно будет писаться формулировка "характеристика или -) да/нет", и поэтому все будет адекватно
#34
Отправлено 01 March 2012 - 12:06 AM
Конечно, meta_keywords сейчас мало учитываются (или вообще не учитываются) поисковиками, но все же удобно там иметь список характеристик товара поименно. Думаю, в контексте всего объема информации на странице, релевантное содержание meta_keywords будет иметь какой-то дополнительный вес для поисковиков.
Ага, главное соблюсти еще правильную последовательность этих "да да нет да", тогда все будет зашибись )))у Вас все равно будет писаться формулировка "характеристика или -) да/нет", и поэтому все будет адекватно
#35
Отправлено 01 March 2012 - 10:42 AM
Не вдавался в тонкости выбранных алгоритмов сопоставления текста, однако, как мне кажется, в данном примере не все будет гладко:у Вас все равно будет писаться формулировка "характеристика или -) да/нет", и поэтому все будет адекватно
"Диагональ:46" и "Диагональ:26" - совершенно разные телевизоры, но разница всего в 1 символ - соответствие сильное - модуль может выбрать в кач-ве аналога
"Высота:195" и Высота:200" - аналогичные холодильники, однако отличие уже целых 3 символа....
Или алгоритм работает как-то иначе?
#36
Отправлено 05 March 2012 - 06:11 PM
есть в магазине подставки под телевизор (keywords: подставка, телевизор)
совпали в мета-кейвордс слова "телевизор" - и при просмотре страницы product_detalied телевизора, ему магазин предложит купить еще и подставку
а выборку товаров делать mysql запросом с ключом LIKE %meta_keyword%
#37
Отправлено 05 March 2012 - 06:37 PM
Вы путаете "аналогичные товары" и "сопутствующие товары", а ведь эти два множества даже не являются пересекающимися. См. название темы .зачем так все усложнять? зачем дополнительные характеристики? если чел покупает телевизор (keywords: телевизор, самсунг, samsung, UE-32D4010)
есть в магазине подставки под телевизор (keywords: подставка, телевизор)
---------- Сообщение объединено ----------
И это будет совершенно правильно. Т.к. если надо выбрать пять аналогов "Диагональ:46" и они есть, то будут выбраны они, как более близкие. А если нет, то наиболее близкими будут "Диагональ:32". Нет и их - тогда "Диагональ:26". Это ж аналоги не из общемирового списка телевизоров, а ближайшие из тех, что есть в базе ."Диагональ:46" и "Диагональ:26" - совершенно разные телевизоры, но разница всего в 1 символ - соответствие сильное - модуль может выбрать в кач-ве аналога
PS. Понятно, что правильнее было бы еще и разные весовые коэффициенты у разных характеристик задавать, но вот нет их штатно, что ж делать...
#38
Отправлено 01 April 2012 - 03:24 PM
ведь оба входных параметра известны до начала цикла и неизменны?
#39
Отправлено 01 April 2012 - 03:57 PM