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.
Qual é a diferença entre os diferentes tipos de pesquisa?
Estou especialmente interessado em saber como o comportamento e o desempenho da pesquisa são alterados para essas configurações.
Respostas:
Todo mundo sempre reclama da pesquisa Magento, mas acredito que ela pode funcionar muito bem se você gastar tempo planejando e configurando-a corretamente.
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.
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_Mysql4
linha 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
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.
Você pode solucionar os pontos 5 e 6 usando o método Combine - os resultados LIKE devem compensar as palavras que o FULLTEXT ignorar.
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:
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:
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.
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
OR
para AND
?
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.php
você 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)
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?
LIKE
nas 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.
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.