Jump to content

Editar buscador web para 4 últimos digitos de la referencia (Modificar buscador)


Recommended Posts

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

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 by Enrique Gómez (see edit history)
  • Like 1
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...