rcalero Posted March 14, 2014 Share Posted March 14, 2014 Buenas, Tengo una tienda ecommerce de cara al público y también la utilizamos como catalogo propio nuestro para buscar. El buscador de la web si pones la referencia completa del producto te encuentra los productos, lo interesante sería que al poner sólo los 4 últimos digitos de la referencia te mostrara los productos. ¿Se puede editar de alguna manera? Un saludo Link to comment Share on other sites More sharing options...
rcalero Posted March 14, 2014 Author Share Posted March 14, 2014 ¿Alguien por aquí? Link to comment Share on other sites More sharing options...
Enrique Gómez Posted March 15, 2014 Share Posted March 15, 2014 (edited) Poder se puede hacer.. pero hay que meter mano a la clase Search.php (classes/Search.php) Una opción es que PS cuando busque la palabra a parte de mirar que empieza por, mire si contiene, con lo cual los resultados son mas amplios, y en tu caso añadir que acaba por también sería una opción Este se haría en el LIKE sobre la línea 200 (en PS1561) $intersect_array[] = 'SELECT si.id_product FROM '._DB_PREFIX_.'search_word sw LEFT JOIN '._DB_PREFIX_.'search_index si ON sw.id_word = si.id_word WHERE sw.id_lang = '.(int)$id_lang.' AND sw.id_shop = '.$context->shop->id.' AND sw.word LIKE '.($word[0] == '-' ? ' \''.pSQL(Tools::substr($word, 1, PS_SEARCH_MAX_WORD_LENGTH)).'%\'' : '\''.pSQL(Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'%\'' Como opción simple puedes ampliar la búsqueda para el caso que contiene, esto se hace poniendo un % al principio del LIKE. $intersect_array[] = 'SELECT si.id_product FROM '._DB_PREFIX_.'search_word sw LEFT JOIN '._DB_PREFIX_.'search_index si ON sw.id_word = si.id_word WHERE sw.id_lang = '.(int)$id_lang.' AND sw.id_shop = '.$context->shop->id.' AND sw.word LIKE '.($word[0] == '-' ? ' \'%'.pSQL(Tools::substr($word, 1, PS_SEARCH_MAX_WORD_LENGTH)).'%\'' : '\'%'.pSQL(Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'%\'' ); Pero creo que es mejor añadir al índice de palabras que usa PS los últimos dígitos de tu referencia. Así es menos intrusivo con las búsquedas. Esto es, a la hora de indexar en la select pones RIGHT(p.reference,4) as short_ref y así se guardará en el índice de búsquedas estos 4 últimos dígitos. Así quedaría que la función getProductsToIndex (linea 399 en PS1561) es ahora: protected static function getProductsToIndex($total_languages, $id_product = false, $limit = 50) { // Adjust the limit to get only "whole" products, in every languages (and at least one) $max_possibilities = $total_languages * count(Shop::getShops(true)); $limit = max($max_possibilities, floor($limit / $max_possibilities) * $max_possibilities); return Db::getInstance()->executeS(' SELECT p.id_product, pl.id_lang, pl.id_shop, pl.name pname, p.reference,RIGHT(p.reference,4) as short_ref, p.ean13, p.upc, pl.description_short, pl.description, cl.name cname, m.name mname, l.iso_code FROM '._DB_PREFIX_.'product p LEFT JOIN '._DB_PREFIX_.'product_lang pl ON p.id_product = pl.id_product '.Shop::addSqlAssociation('product', 'p').' LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = product_shop.id_category_default AND pl.id_lang = cl.id_lang AND cl.id_shop = product_shop.id_shop) LEFT JOIN '._DB_PREFIX_.'manufacturer m ON m.id_manufacturer = p.id_manufacturer LEFT JOIN '._DB_PREFIX_.'lang l ON l.id_lang = pl.id_lang WHERE product_shop.indexed = 0 AND product_shop.visibility IN ("both", "search") '.($id_product ? 'AND p.id_product = '.(int)$id_product : '').' LIMIT '.(int)$limit ); } A parte hay que informar a PS de que ese nuevo campo short_ref tiene un peso en la búsqueda de forma que donde esta el array de pesos (línea 461) pones la linea 'short_ref' => Configuration::get('PS_SEARCH_WEIGHT_REF'), después de reference $weight_array = array( 'pname' => Configuration::get('PS_SEARCH_WEIGHT_PNAME'), 'reference' => Configuration::get('PS_SEARCH_WEIGHT_REF'), 'short_ref' => Configuration::get('PS_SEARCH_WEIGHT_REF'), 'ean13' => Configuration::get('PS_SEARCH_WEIGHT_REF'), 'upc' => Configuration::get('PS_SEARCH_WEIGHT_REF'), 'description_short' => Configuration::get('PS_SEARCH_WEIGHT_SHORTDESC'), 'description' => Configuration::get('PS_SEARCH_WEIGHT_DESC'), 'cname' => Configuration::get('PS_SEARCH_WEIGHT_CNAME'), 'mname' => Configuration::get('PS_SEARCH_WEIGHT_MNAME'), 'tags' => Configuration::get('PS_SEARCH_WEIGHT_TAG'), 'attributes' => Configuration::get('PS_SEARCH_WEIGHT_ATTRIBUTE'), 'features' => Configuration::get('PS_SEARCH_WEIGHT_FEATURE') ); Nota: No te olvides de reindexar los productos desde Preferencias > Buscar Edited March 15, 2014 by Enrique Gómez (see edit history) 1 Link to comment Share on other sites More sharing options...
rcalero Posted March 15, 2014 Author Share Posted March 15, 2014 Muchisimas gracias, voy a probar y comento por aquí que tal Link to comment Share on other sites More sharing options...
nadie Posted March 15, 2014 Share Posted March 15, 2014 Si lo comentado le funciona, no se le olvide crear un override de la clase, para mantenerlo todo mejor organizado. Saludos, 2 Link to comment Share on other sites More sharing options...
Recommended Posts