Tipo di ricerca: Mi piace, Testo completo o Combinato?


48

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.

Risposte:


63

Tutti si lamentano sempre della ricerca di Magento, ma credo che possa funzionare davvero bene se passi il tempo a pianificarlo e configurarlo correttamente.


Piace

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.


Testo intero

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_Mysql4riga 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


combinare

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.


Cose da notare

  1. Consiglio vivamente di utilizzare FULLTEXT per prestazioni migliori e risultati pertinenti
  2. Passare attraverso ciascun attributo e considerare se è necessario aggiungerlo o meno all'indice full-text ('Usa nella ricerca rapida')
  3. Per impostazione predefinita, le descrizioni dei prodotti sono incluse nell'indicizzazione FULLTEXT. Rimuovo quasi sempre le descrizioni poiché inquinano i punteggi di pertinenza con le parole utilizzate in contesti irrilevanti.
  4. Assicurati che i tuoi meta attributi siano utilizzati nell'indice full-text. Popolarli con contenuti significativi.
  5. MySQL FULLTEXT ha alcune stranezze: ha un elenco di parole ignorate che possono essere problematiche se i nomi dei tuoi prodotti sono composti da queste parole!
  6. MySQL per impostazione predefinita ignora le query FULLTEXT con meno di 4 caratteri . Gli attributi con valori brevi verranno ignorati se non si modifica questo valore.

Puoi aggirare i punti 5 e 6 usando il metodo Combine: i risultati LIKE dovrebbero compensare qualsiasi parola FULLTEXT ignorata.


7

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:

  • diventerà rapidamente un problema di prestazioni
  • la pertinenza è negativa. In realtà non esiste un concetto di "pertinenza" in query simili

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:

  • le prestazioni sono migliori
  • escluderà le parole d'ordine (come "e", "con" ecc.)
  • Assegnerà un punteggio per impostazione predefinita a ciascun risultato in base alla pertinenza

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.


1
Grazie per questa risposta Perché dovrei aver bisogno di Magento EE?
PiTheNumber

1
La ricerca Solr fa parte di Magento Enterprise (non una funzionalità della comunità). Esistono estensioni che implementeranno la ricerca nella comunità come magentocommerce.com/magento-connect/solr-bridge-search.html . Non li ho usati però.
Paul Grigoruta

6

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


Il testo completo è più potente, ma ha bisogno di configurazioni in my.cnf se darà risultati per parole con meno di 5 o 4 caratteri, a seconda della sua configurazione predefinita. Come spesso la ricerca viene spedita interrotta e deve cambiare la sua logica da OR a AND in modo da non produrre troppi risultati irrilevanti.
Fiasco Labs

Hai ragione riguardo al testo completo. È sempre intelligente ospitare su un VPS o con un'azienda che offre hosting Magento. Opzioni come la configurazione Fulltext dovrebbero essere disponibili o almeno puoi impostarle tu stesso. Hai suggerimenti di ricerca di terze parti @Fiasco Labs?
Sander Mangel

@FiascoLabs, come si cambia ORin AND?
Michael Yaeger,

3

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


1
Hai menzionato di scavalcare app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php. Questo file non viene utilizzato in nessun luogo diverso dalla funzionalità di ricerca?
entro il

1
@amitshree Buona domanda. Non so dalla cima della mia testa. Suppongo che potrebbe essere utilizzato da qualsiasi risorsa modello per i risultati della ricerca. Ma questo è davvero specifico per l'escape LIKEnelle 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.
Buttle Butkus,

2

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.