¿Cuál es la diferencia entre los diferentes tipos de búsqueda?
- Me gusta
- Texto completo
- Conjunto
Estoy especialmente interesado en cómo cambia el comportamiento de búsqueda y el rendimiento de esa configuración.
¿Cuál es la diferencia entre los diferentes tipos de búsqueda?
Estoy especialmente interesado en cómo cambia el comportamiento de búsqueda y el rendimiento de esa configuración.
Respuestas:
Todos siempre se quejan de la búsqueda de Magento, pero creo que puede funcionar muy bien si pasas tiempo planeando y configurando correctamente.
Método de búsqueda basado en palabras clave, dividiendo su consulta en palabras individuales. Vea lo siguiente de la línea 326 en claseMage_CatalogSearch_Model_Resource_Fulltext::prepareResult()
$words = Mage::helper('core/string')->splitWords($queryText, true, $query->getMaxQueryWords());
foreach ($words as $word) {
$like[] = $helper->getCILike('s.data_index', $word, array('position' => 'any'));
}
if ($like) {
$likeCond = '(' . join(' OR ', $like) . ')';
}
Puede ver que divide cada palabra en su consulta de búsqueda y las une en declaraciones ME GUSTA; termina con algo como esto:
WHERE `attribute` LIKE 'my' OR `attribute` LIKE 'search' OR `attribute` LIKE 'query'
Este método podría funcionar para ciertas configuraciones de tienda donde los nombres de productos son simples y los clientes buscan artículos muy específicos, pero en mi experiencia no es una buena opción.
Búsqueda basada en relevancia: cada consulta de búsqueda se califica según una puntuación asignada en función de la consulta MATCH ... CONTRA MySQL . Puedes ver esto en acción en la Mage_CatalogSearch_Model_Resource_Helper_Mysql4
línea 44:
public function chooseFulltext($table, $alias, $select)
{
$field = new Zend_Db_Expr('MATCH ('.$alias.'.data_index) AGAINST (:query IN BOOLEAN MODE)');
$select->columns(array('relevance' => $field));
return $field;
}
La tabla de la base de datos que Magento usa cuando realiza búsquedas de texto completo es catalogsearch_fulltext
. Un valor de ejemplo:
EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|
Estos valores están directamente vinculados a los atributos que especifique como 'Usar en búsqueda rápida' en Catálogo> Atributos> Administrar atributos
Bastante autoexplicativo. Eche un vistazo a la línea 354 de Mage_CatalogSearch_Model_Resource_Fulltext :
if ($likeCond != '' && $searchType == Mage_CatalogSearch_Model_Fulltext::SEARCH_TYPE_COMBINE) {
$where .= ($where ? ' OR ' : '') . $likeCond;
} elseif ($likeCond != '' && $searchType == Mage_CatalogSearch_Model_Fulltext::SEARCH_TYPE_LIKE) {
$select->columns(array('relevance' => new Zend_Db_Expr(0)));
$where = $likeCond;
}
Puede ver que solo agrega los resultados LIKE después de que los resultados FULLTEXT hayan regresado.
Puede solucionar los puntos 5 y 6 utilizando el método Combinar: los resultados LIKE deberían compensar las palabras que FULLTEXT ignore.
La búsqueda "me gusta" hará la coincidencia me gusta habitual, utilizando una consulta me gusta '% keyword%'. Una ventaja de este tipo de búsqueda es que coincidirá con palabras parciales. Sin embargo, tiene serios inconvenientes:
La búsqueda de texto completo funcionará con la búsqueda de texto completo MyISAM ( http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html ). Deberías leer al respecto, pero en pocas palabras:
El inconveniente del texto completo es que no puede hacer coincidencias parciales, es decir, una búsqueda de "pho" no encontrará "teléfono"
La búsqueda "combinada" utilizará una condición de "me gusta" para que coincida con los resultados, pero también tendrá en cuenta la puntuación de búsqueda de texto completo para ordenarlos. Esto significa que obtendrá más resultados (ya que la búsqueda también hará coincidencias parciales) y también se ordenarán mejor debido a la puntuación de texto completo.
Como dijeron otras personas, si usted es serio acerca de la búsqueda, debería usar Solr. Es mucho más rápido y mucho más relevante. Sin embargo, deberías tener Magento EE e instalar Solr.
Son referencias directas al tipo de consulta que utilizará Magento. Personalmente, creo que la búsqueda de texto completo es más potente y el rendimiento es mejor, especialmente si LIKE se usa con comodines (%). Una combinación de ambos probablemente será más precisa, pero podría ser exagerada. Me quedaría con el texto completo.
Pero si está buscando una solución de búsqueda potente, consulte este proyecto: https://code.google.com/p/magento-solr/ . SOLR se creó para buscar grandes colecciones y, aunque puede llevar un tiempo implementarlo, debería valer la pena. Personalmente, nunca lo he usado en Magento antes, pero en otros proyectos PHP funcionó muy bien.
La documentación del texto completo se puede encontrar aquí: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html COMO documentación aquí: http://dev.mysql.com/doc/refman/5.0 /en/string-comparison-functions.html
OR
a AND
?
El problema con LIKE es que usa "% term%" por defecto. Lo he cambiado para que coincida con "term%" (tenga en cuenta el espacio antes del término), para que coincida con el comienzo de las palabras. También corté la 's' final en un término de búsqueda para que "carros" dé los mismos resultados que "car". Obviamente, eso no ayuda con sustantivos irregulares como "niños", pero de todos modos es una gran mejora.
El mayor movimiento inexplicablemente sin sentido de Magento es usar la búsqueda "O" en lugar de "Y". Si busca "autos rojos", obtendrá todo rojo (incluidos automóviles, perros, tenedores, laderas de montañas, etc.) y todo tipo de automóviles (incluidos rojo, azul, verde, amarillo, etc.). Con "Y", solo obtienes elementos que contienen "Y" rojo "rojo", ¡así es como debería funcionar la búsqueda !
Citando la respuesta de jharrison.au, cambie esto:
if ($like) {
$likeCond = '(' . join(' OR ', $like) . ')';
}
A esto:
if ($like) {
$likeCond = '(' . join(' AND ', $like) . ')';
}
Para obtener un impulso inmediato y masivo a la relevancia de sus resultados de búsqueda.
Para lo plural, puede cortar la "s" final de una palabra como esta:
$words = Mage::helper('core/string')->splitWords($queryText, true, $query->getMaxQueryWords());
$words = array_walk($words,function(&$value, &$key) {
// use substr(...) instead of rtrim($value,'s')
// because rtrim will remove multiple esses
$value = (substr($value,-1,1) === 's') ? substr($value,0,strlen($value - 1)) : $value;
});
foreach ($words as $word) {
$like[] = $helper->getCILike('s.data_index', $word, array('position' => 'start')); // note I changed this to 'start'
}
En app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
puede anular el archivo principal y cambiarlo public function escapeLikeValue($value, $options = array())
como un acceso directo rápido, aunque la forma recomendada es hacer lo mismo en un módulo. Pero aquí está.
Debajo if (isset($options['position'])) {
hay un interruptor. Cambié los casos de 'inicio' y 'fin' para agregar espacios antes y después del valor:
case 'start':
$value = '% ' . $value . '%'; // added '% ' . before
// $value = $value . '%'; // core way (bad way)
break;
case 'end':
$value = '%' . $value . ' %'; // added . ' %' after
// $value = '%' . $value; // core way (bad way)
break;
Para que los espacios antes / después funcionen, probablemente también tenga que cambiar la forma en que se construye el índice de búsqueda, como lo hice yo, para asegurarse de que haya un espacio antes y después de cada palabra. La forma predeterminada de crear el índice es separar cada campo por un '|' (carácter de tubería), por ejemplo, "azul | automóvil | un automóvil muy agradable" para indexar el color, el tipo de producto, la descripción del producto. Pero mi índice tiene "auto azul | un auto muy lindo". Incluso puede modificar la construcción del índice de búsqueda para que se reemplacen las palabras con guiones ("super-fast car" se convierte en "super fast car"), etc., etc.
Tomando prestado un ejemplo de la respuesta de jharrison.au, donde un campo de índice de búsqueda predeterminado se vería así:
EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|
El mío se vería así:
EmCO0014e | Emma Certified | Emma Certified Organic Herbal Tonic Mist TRIAL / TRAVEL | Australian | Certified Organic | Palm Oil Free | Nut Free | Vegan Suitable |
(observe espacios antes y después de cada "|" y "/", y un espacio antes de la primera palabra)
app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
. Este archivo no se utiliza en ningún otro lugar que no sea la funcionalidad de búsqueda?
LIKE
en las consultas de búsqueda de SQL, y ¿dónde más busca Magento sino en el índice de búsqueda de productos? Hice este cambio hace más de 2 años en un sitio de producción y no hemos encontrado ningún error relacionado con esto. Todo lo que realmente hace es hacerlo de modo que un "comienzo de palabra" debe tener un espacio antes, y "fin de palabra" debe tener un espacio después. Por separado, en el índice, me aseguro de que cada palabra tenga espacios a su alrededor.
Ninguno de los anteriores, utilice el motor de búsqueda Zend Lucene incorporado al instalar algo como Blast Lucene Search o Extendeware Lucene Search. La relevancia supera a cualquiera de las ofertas de MySQL.
Sí, revisé todas las iteraciones de la respuesta aceptada, pero, francamente, la búsqueda optimizada de Stock Magento todavía era muy escasa.
Lucene, por otro lado, entrega y ya está incluido en la instalación de Magento, solo necesita un Módulo para habilitarlo.