Tipo de búsqueda: ¿Me gusta, texto completo o combinado?


48

¿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.

Respuestas:


63

Todos siempre se quejan de la búsqueda de Magento, pero creo que puede funcionar muy bien si pasas tiempo planeando y configurando correctamente.


Me gusta

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.


Texto completo

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_Mysql4lí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


Combinar

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.


Cosas a tener en cuenta

  1. Recomiendo usar FULLTEXT para un mejor rendimiento y resultados relevantes
  2. Revise cada atributo y considere si es necesario o no agregarlo al índice de texto completo ('Usar en búsqueda rápida')
  3. Por defecto, las descripciones de los productos se incluyen en la indexación FULLTEXT. Casi siempre elimino las descripciones ya que contaminan los puntajes de relevancia con palabras utilizadas en contextos irrelevantes.
  4. Asegúrese de que sus meta atributos se utilicen en el índice de texto completo. Rellene con contenido significativo.
  5. MySQL FULLTEXT tiene algunas peculiaridades: tiene una lista de palabras ignoradas que pueden ser problemáticas si los nombres de sus productos están formados por estas palabras.
  6. MySQL por defecto ignora las consultas FULLTEXT de menos de 4 caracteres . Los atributos con valores cortos se ignorarán a menos que cambie este valor.

Puede solucionar los puntos 5 y 6 utilizando el método Combinar: los resultados LIKE deberían compensar las palabras que FULLTEXT ignore.


7

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:

  • se convertirá rápidamente en un problema de rendimiento
  • La relevancia es mala. En realidad no existe un concepto de "relevancia" en consultas similares

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 rendimiento es mejor
  • excluirá palabras vacías (como "y", "con", etc.)
  • Asignará una puntuación por defecto a cada resultado en función de la relevancia

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.


1
Gracias por esta respuesta ¿Por qué necesitaría Magento EE?
PiTheNumber

1
La búsqueda de Solr es parte de Magento Enterprise (no es una característica de la comunidad). Hay extensiones que implementarán la búsqueda en la comunidad como magentocommerce.com/magento-connect/solr-bridge-search.html . Sin embargo, no los usé.
Paul Grigoruta

6

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


El texto completo es más potente, pero necesita configuraciones en my.cnf si va a dar resultados para palabras de menos de 5 o 4 caracteres, dependiendo de su configuración predeterminada. Al igual que la búsqueda, a menudo se envía rota y necesita cambiar su lógica de OR a AND, por lo que no arroja demasiados resultados irrelevantes.
Fiasco Labs

Tienes razón sobre el texto completo. Siempre es inteligente hospedarse en un VPS o en una empresa que ofrece alojamiento Magento. Las opciones como la configuración de texto completo deberían estar disponibles o, al menos, puede configurarlas usted mismo. ¿Tiene alguna sugerencia de búsqueda de terceros en @Fiasco Labs?
Sander Mangel

@FiascoLabs, ¿cómo cambias el ORa AND?
Michael Yaeger

3

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.phppuede 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)


1
Has mencionado anular 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?
amitshree

1
@amitshree Buena pregunta. No lo sé de la cabeza. Supongo que podría ser utilizado por cualquier recurso modelo para resultados de búsqueda. Pero esto es realmente específicamente para escapar LIKEen 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.
Buttle Butkus

2

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.