Qual è la differenza tra i diversi tipi di ricerca?
- Piace
- Testo intero
- Combinato
Sono particolarmente interessato a come il comportamento di ricerca e le prestazioni cambiano per tali impostazioni.
Qual è la differenza tra i diversi tipi di ricerca?
Sono particolarmente interessato a come il comportamento di ricerca e le prestazioni cambiano per tali impostazioni.
Risposte:
Tutti si lamentano sempre della ricerca di Magento, ma credo che possa funzionare davvero bene se passi il tempo a pianificarlo e configurarlo correttamente.
Metodo di ricerca basato su parole chiave, suddividendo la query in singole parole. Vedere quanto segue dalla riga 326 in 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) . ')';
}
Puoi vedere che divide ogni parola nella tua query di ricerca e le unisce in istruzioni LIKE - finisci con qualcosa del genere:
WHERE `attribute` LIKE 'my' OR `attribute` LIKE 'search' OR `attribute` LIKE 'query'
Questo metodo potrebbe funzionare per alcune configurazioni di negozi in cui i nomi dei prodotti sono semplici e i clienti cercano articoli molto specifici, ma nella mia esperienza non è una buona scelta.
Ricerca basata sulla pertinenza: ogni query di ricerca viene classificata in base a un punteggio assegnato in base alla query MATCH ... CONTRO di MySQL . Puoi vederlo in azione nella Mage_CatalogSearch_Model_Resource_Helper_Mysql4
riga 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 tabella del database utilizzata da Magento durante l'esecuzione di ricerche full-text è catalogsearch_fulltext
. Un valore di esempio:
EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|
Questi valori sono direttamente collegati agli attributi specificati come 'Usa nella ricerca rapida' in Catalogo> Attributi> Gestisci attributi
Abbastanza esplicativo. Dai un'occhiata alla linea 354 di 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;
}
Puoi vedere che aggiunge solo i risultati LIKE dopo che i risultati FULLTEXT sono tornati.
Puoi aggirare i punti 5 e 6 usando il metodo Combine: i risultati LIKE dovrebbero compensare qualsiasi parola FULLTEXT ignorata.
La ricerca "mi piace" farà la solita corrispondenza simile, usando una query simile "% keyword%". Un vantaggio di questo tipo di ricerca è che corrisponderà a parole parziali. Ha però seri inconvenienti:
La ricerca full-text funzionerà utilizzando la ricerca full-text MyISAM ( http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html ). Dovresti leggerlo, ma in poche parole:
Lo svantaggio del testo completo è che non è possibile eseguire corrispondenze parziali, ovvero una ricerca di "pho" non troverà "telefono"
La ricerca "combinata" utilizzerà una condizione "mi piace" per abbinare i risultati, ma prenderà in considerazione anche il punteggio di ricerca full-text per ordinarli. Ciò significa che otterrai più risultati (poiché anche la ricerca farà corrispondenze parziali) e saranno anche ordinati meglio a causa del punteggio full-text.
Come altri hanno già detto, se sei seriamente interessato alla ricerca dovresti usare Solr. È molto più veloce e molto più rilevante. Dovresti possedere Magento EE e installare Solr tu stesso.
Sono riferimenti diretti al tipo di query che Magento utilizzerà. Personalmente penso che la ricerca full-text sia più potente e che le prestazioni siano migliori, specialmente se LIKE è usato con i caratteri jolly (%). Una combinazione di entrambi sarà probabilmente la più accurata, ma potrebbe essere eccessiva. Continuerei con il testo completo.
Ma se stai cercando una potente soluzione di ricerca, dai un'occhiata a questo progetto: https://code.google.com/p/magento-solr/ . SOLR è stato creato per la ricerca di raccolte di grandi dimensioni e potrebbe richiedere del tempo per implementarlo, ma ne varrà la pena. Personalmente non l'ho mai usato in Magento prima, ma in altri progetti PHP ha funzionato molto bene.
La documentazione di testo completo è disponibile qui: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html Documentazione LIKE qui: http://dev.mysql.com/doc/refman/5.0 /en/string-comparison-functions.html
OR
in AND
?
Il problema con LIKE è che usa "% term%" per impostazione predefinita. L'ho modificato in modo che corrisponda al "termine%" (notare lo spazio prima del termine), in modo che corrisponda agli inizi delle parole. Ho anche tagliato la "s" finale in un termine di ricerca in modo che "auto" fornisca gli stessi risultati di "auto". Ovviamente ciò non aiuta con nomi irregolari come "bambini", ma è comunque un grande miglioramento.
La mossa inspiegabilmente più assurda di Magento è usare la ricerca "OR" invece di "AND". Se cerchi "macchine rosse" otterrai tutto in rosso (comprese macchine, cani, forchette, montagne, ecc.) E ogni tipo di macchina (incluso rosso, blu, verde, giallo, ecc.). Con "AND", ottieni solo gli elementi che contengono "rosso" AND "auto", che è come dovrebbe funzionare la ricerca !
Citando la risposta di jharrison.au, cambia questo:
if ($like) {
$likeCond = '(' . join(' OR ', $like) . ')';
}
A questo:
if ($like) {
$likeCond = '(' . join(' AND ', $like) . ')';
}
Per ottenere un'immediata, enorme spinta alla pertinenza dei risultati della ricerca.
Per la cosa plurale, puoi tagliare le "s" finali di una parola come questa:
$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'
}
In app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
puoi sovrascrivere il file core e modificarlo public function escapeLikeValue($value, $options = array())
come scorciatoia rapida, anche se il modo consigliato è fare la stessa cosa in un modulo. Ma eccolo qui.
Sotto if (isset($options['position'])) {
c'è un interruttore. Ho cambiato i casi di 'inizio' e 'fine' per aggiungere spazi prima e dopo il valore:
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;
Affinché gli spazi prima / dopo funzionino, probabilmente devi anche cambiare il modo in cui l'indice di ricerca è costruito, come ho fatto io, in modo che si assicuri che ci sia uno spazio prima e dopo ogni parola. Il modo predefinito per costruire l'indice è di separare ogni campo con un '|' (carattere del tubo), ad es. "blu | auto | un'auto molto bella" per indicizzare colore, tipo di prodotto, descrizione del prodotto. Ma il mio indice ha "blu | macchina | una macchina molto bella". Puoi persino modificare la costruzione dell'indice di ricerca in modo che le parole forse trattate vengano sostituite ("auto super veloce" diventa "auto super veloce"), ecc., Ecc.
Prendendo in prestito un esempio dalla risposta di jharrison.au, in cui un campo indice di ricerca predefinito sarebbe simile al seguente:
EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|
Il mio sarebbe simile a questo:
EmCO0014e | Emma Certified | Emma Certified Organic Herbal Tonic Mist TRIAL / TRAVEL | Australian | Certified Organic | Palm Oil Free | Nut Free | Vegan Suitable |
(nota gli spazi prima e dopo ogni "|" e "/" e uno spazio prima della prima parola)
app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
. Questo file non viene utilizzato in nessun luogo diverso dalla funzionalità di ricerca?
LIKE
nelle query di ricerca SQL, e dove altro cerca Magento se non nell'indice di ricerca del prodotto? Ho apportato questa modifica oltre 2 anni fa in un sito di produzione e non abbiamo trovato alcun bug relativo a questo. Tutto ciò che fa è farlo in modo che un "inizio di parola" debba avere uno spazio prima di esso, e "fine di parola" debba avere uno spazio dopo. Separatamente, nell'indice, mi assicuro che ogni parola abbia degli spazi attorno.
Nessuno dei precedenti, usa il motore di ricerca Zend Lucene integrato installando qualcosa come Blast Lucene Search o Extendeware Lucene Search. La rilevanza supera qualsiasi offerta di MySQL.
Sì, ho esaminato tutte le iterazioni sulla risposta accettata, ma francamente, la ricerca di Stock Magento ottimizzata era ancora carente.
Lucene d'altra parte, consegna ed è già incluso nell'installazione di Magento, ha solo bisogno di un modulo per abilitarlo.