Tipo de pesquisa: como, texto completo ou combinado?

48

Qual é a diferença entre os diferentes tipos de pesquisa?

  • Gostar
  • Texto completo
  • Combinado

Estou especialmente interessado em saber como o comportamento e o desempenho da pesquisa são alterados para essas configurações.

PiTheNumber
fonte

Respostas:

63

Todo mundo sempre reclama da pesquisa Magento, mas acredito que ela pode funcionar muito bem se você gastar tempo planejando e configurando-a corretamente.


Gostar

Método de pesquisa baseado em palavras-chave, dividindo sua consulta em palavras individuais. Veja o seguinte da linha 326 na classeMage_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) . ')';
            }

Você pode ver que ele divide cada palavra na sua consulta de pesquisa e as une nas instruções LIKE - você acaba com algo assim:

WHERE `attribute` LIKE 'my' OR `attribute` LIKE 'search' OR `attribute` LIKE 'query'

Esse método pode funcionar para determinadas configurações de loja, onde os nomes dos produtos são simples e os clientes pesquisam itens muito específicos, mas, na minha experiência, não é uma boa escolha.


Texto completo

Pesquisa baseada em relevância - toda consulta de pesquisa é classificada de acordo com uma pontuação atribuída com base na consulta MATCH ... AGAINST do MySQL . Você pode ver isso em ação na Mage_CatalogSearch_Model_Resource_Helper_Mysql4linha 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;
}

A tabela de banco de dados que o Magento usa ao executar pesquisas de texto completo é catalogsearch_fulltext. Um valor de exemplo:

EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|

Esses valores estão diretamente vinculados aos atributos especificados como 'Usar na pesquisa rápida' em Catálogo> Atributos> Gerenciar atributos


Combinar

Bastante auto-explicativo. Dê uma olhada na linha 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;
        }

Você pode ver que apenas adiciona os resultados LIKE após os resultados do FULLTEXT voltarem.


Coisas a observar

  1. Eu recomendo fortemente o uso do FULLTEXT para obter melhor desempenho e resultados relevantes
  2. Percorra cada atributo e considere se é necessário adicioná-lo ou não ao índice de texto completo ('Usar na pesquisa rápida')
  3. Por padrão, as descrições do produto estão incluídas na indexação do FULLTEXT. Quase sempre removo as descrições, pois poluem as pontuações de relevância com palavras usadas em contextos irrelevantes.
  4. Verifique se seus meta atributos são usados ​​no índice de texto completo. Preencha-os com conteúdo significativo.
  5. O MySQL FULLTEXT possui algumas peculiaridades - ele possui uma lista de palavras ignoradas, que podem ser problemáticas se os nomes dos seus produtos forem compostos por essas palavras!
  6. O MySQL, por padrão, ignora consultas FULLTEXT com menos de 4 caracteres . Os atributos com valores curtos serão ignorados, a menos que você altere esse valor.

Você pode solucionar os pontos 5 e 6 usando o método Combine - os resultados LIKE devem compensar as palavras que o FULLTEXT ignorar.

jharrison.au
fonte
7

A pesquisa "curtida" fará a correspondência curtida usual, usando uma consulta semelhante '% keyword%'. Uma vantagem desse tipo de pesquisa é que ele corresponderá a palavras parciais. No entanto, existem sérios inconvenientes:

  • rapidamente se tornará um problema de desempenho
  • relevância é ruim. Na verdade, não há conceito de "relevância" em consultas semelhantes

A pesquisa de texto completo funcionará usando a pesquisa de texto completo do MyISAM ( http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html ). Você deve ler sobre isso, mas em poucas palavras:

  • desempenho é melhor
  • excluirá palavras irrelevantes (como "e", "com" etc)
  • Ele atribuirá uma pontuação por padrão a cada resultado com base na relevância

A desvantagem do texto completo é que ele não pode fazer correspondências parciais, ou seja, uma pesquisa por "pho" não encontrará "telefone"

A pesquisa "combinada" usará uma condição "like" para corresponder aos resultados, mas também levará em consideração a pontuação da pesquisa de texto completo para classificá-los. Isso significa que você obterá mais resultados (como a pesquisa também fará correspondências parciais) e eles também serão ordenados melhor devido à pontuação do texto completo.

Como outras pessoas disseram, se você é sério sobre a pesquisa, deve usar o Solr. É muito mais rápido e muito mais relevante. Você teria que possuir o Magento EE e instalar o Solr por conta própria.

Paul Grigoruta
fonte
1
Obrigado por esta resposta. Por que eu precisaria do Magento EE?
PiTheNumber
1
A pesquisa do Solr faz parte do Magento Enterprise (não é um recurso da comunidade). Existem extensões que implementam a pesquisa na comunidade, como magentocommerce.com/magento-connect/solr-bridge-search.html . Eu não os usei embora.
Paul Grigoruta
6

Eles são referências diretas ao tipo de consulta que o Magento usará. Pessoalmente, acho que a pesquisa de texto completo é mais poderosa e o desempenho é melhor, especialmente se o LIKE for usado com caracteres curinga (%). Uma combinação de ambos provavelmente será mais precisa, mas pode ser um exagero. Eu ficaria com o texto completo.

Mas se você está procurando uma solução de pesquisa poderosa, confira este projeto: https://code.google.com/p/magento-solr/ . O SOLR foi criado para pesquisar coleções grandes e, embora possa levar algum tempo para implementá-lo, vale a pena. Pessoalmente, nunca o usei no Magento antes, mas em outros projetos PHP ele teve um desempenho muito bom.

A documentação em texto completo pode ser encontrada aqui: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html COMO a documentação aqui: http://dev.mysql.com/doc/refman/5.0 /en/string-comparison-functions.html

Sander Mangel
fonte
O texto completo é mais poderoso, mas precisa de configurações no my.cnf para fornecer resultados para palavras com menos de 5 ou 4 caracteres, dependendo da configuração padrão. Como a pesquisa geralmente é enviada com defeito e precisa ter sua lógica alterada de OR para AND, para não gerar muitos resultados irrelevantes.
Fiasco Labs 05/03
Você está certo sobre o texto completo. É sempre inteligente hospedar em um VPS ou com uma empresa que oferece hospedagem Magento. Opções como a configuração de texto completo devem estar disponíveis ou, pelo menos, você pode defini-las. Você tem alguma sugestão de pesquisa de terceiros no @Fiasco Labs?
Sander Mangel
@FiascoLabs, como você muda ORpara AND?
Michael Yaeger
3

Problema com o LIKE é que ele usa "% term%" por padrão. Eu mudei para corresponder a "termo%" (observe o espaço antes do termo), para que corresponda ao início das palavras. Eu também cortei os finais 's' em um termo de pesquisa para que "carros" dê os mesmos resultados que "carro". Obviamente, isso não ajuda com substantivos irregulares como "filhos", mas é uma grande melhoria de qualquer maneira.

O maior movimento inexplicável e sem sentido do Magento é usar a pesquisa "OR" em vez de "AND". Se você pesquisar "carros vermelhos", tudo ficará vermelho (incluindo carros, cães, garfos, encostas das montanhas etc.) e todo tipo de carro (incluindo vermelho, azul, verde, amarelo etc.). Com "AND", você obtém apenas itens que contêm "red" AND "car", e é assim que a pesquisa deve funcionar!

Citando a resposta de jharrison.au, altere isso:

if ($like) {
                $likeCond = '(' . join(' OR ', $like) . ')';
            }

Para isso:

if ($like) {
                $likeCond = '(' . join(' AND ', $like) . ')';
            }

Para obter um impulso imediato e maciço à relevância dos seus resultados de pesquisa.

Para o plural, você pode cortar os "s" finais de uma palavra 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'
}

Em app/code/local/Mage/Core/Model/Resource/Helper/Abstract.phpvocê pode substituir o arquivo de núcleo e mudar o public function escapeLikeValue($value, $options = array())como um atalho rápido, embora o caminho aconselhado é fazer a mesma coisa em um módulo. Mas aqui está.

Debaixo if (isset($options['position'])) {há um interruptor. Alterei os casos para 'start' e 'end' para adicionar espaços antes e depois do 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 os espaços antes / depois do trabalho, você provavelmente também precisará alterar a maneira como o índice de pesquisa é criado, como eu fiz, para garantir que haja um espaço antes e depois de cada palavra. A maneira padrão de criar o índice é separar cada campo por um '|' (caractere de barra), por exemplo "azul | carro | um carro muito bonito" para indexar cores, tipo de produto, descrição do produto. Mas meu índice tem "carro azul | um carro muito bonito". Você pode até modificar a construção do índice de pesquisa para que talvez as palavras hifenizadas sejam substituídas ("carro super-rápido" se torna "carro super-rápido"), etc. etc.

Tomando emprestado um exemplo da resposta de jharrison.au, em que um campo de índice de pesquisa padrão ficaria assim:

EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|

O meu ficaria assim:

 EmCO0014e | Emma Certified | Emma Certified Organic Herbal Tonic Mist TRIAL / TRAVEL | Australian | Certified Organic | Palm Oil Free | Nut Free | Vegan Suitable | 

(observe os espaços antes e depois de cada "|" e "/" e um espaço antes da primeira palavra)

Buttle Butkus
fonte
1
Você mencionou substituir app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php. Este arquivo não é usado em nenhum outro lugar que não seja a funcionalidade de pesquisa?
amitshree
1
@amitshree Boa pergunta. Eu não sei do alto da minha cabeça. Poderia ser usado por qualquer recurso de modelo para resultados de pesquisa, suponho. Mas isso é realmente específico para escapar LIKEnas consultas de pesquisa SQL, e onde mais o Magento pesquisa, exceto no índice de pesquisa de produtos? Fiz essa alteração há mais de 2 anos em um site de produção e não encontramos nenhum bug relacionado a isso. Tudo o que realmente faz é torná-lo para que um "início da palavra" tenha um espaço antes e o "fim da palavra" tenha um espaço depois. Separadamente, no índice, asseguro-me de que cada palavra tenha espaços ao seu redor.
Buttle Butkus
2

Nenhuma das opções acima, use o mecanismo de pesquisa incorporado do Zend Lucene instalando algo como o Blast Lucene Search ou o Extendeware Lucene Search. A relevância supera qualquer uma das ofertas do MySQL.

Sim, eu passei por todas as iterações da resposta aceita, mas, francamente, a pesquisa Optimized Stock Magento ainda estava faltando.

O Lucene, por outro lado, entrega e já está incluído na instalação do Magento, apenas precisa de um módulo para habilitá-lo.

Fiasco Labs
fonte