Suchtyp: Gefällt mir, Volltext oder Kombiniert?

48

Was ist der Unterschied zwischen den verschiedenen Suchtypen?

  • Mögen
  • Voller Text
  • Kombiniert

Mich interessiert besonders, wie sich das Suchverhalten und die Leistung für diese Einstellungen ändern.

PiTheNumber
quelle

Antworten:

63

Jeder beschwert sich immer über Magento-Suche, aber ich glaube, es kann sehr gut funktionieren, wenn Sie Zeit damit verbringen, es richtig zu planen und zu konfigurieren.


Mögen

Keyword-basierte Suchmethode, die Ihre Suchanfrage in einzelne Wörter aufteilt. Siehe das Folgende aus Zeile 326 in der KlasseMage_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) . ')';
            }

Sie können sehen, dass jedes Wort in Ihrer Suchanfrage aufgeteilt und in LIKE-Anweisungen zusammengefügt wird. Am Ende erhalten Sie Folgendes:

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

Diese Methode eignet sich möglicherweise für bestimmte Ladeneinrichtungen, in denen die Produktnamen einfach sind und die Kunden nach sehr spezifischen Artikeln suchen. Meiner Erfahrung nach ist sie jedoch keine gute Wahl.


Voller Text

Relevanzbasierte Suche - Jede Suchanfrage wird nach einer Punktzahl bewertet, die auf MySQLs Abfrage MATCH ... AGAINST basiert . Sie können dies in Aktion in Mage_CatalogSearch_Model_Resource_Helper_Mysql4Zeile 44 sehen:

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;
}

Die Datenbanktabelle, die Magento für die Volltextsuche verwendet, ist catalogsearch_fulltext. Ein Beispielwert:

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

Diese Werte sind direkt mit den Attributen verknüpft, die Sie unter "Katalog> Attribute> Attribute verwalten" als "In der Schnellsuche verwenden" angegeben haben


Kombinieren

Ziemlich selbsterklärend. Schauen Sie sich Zeile 354 von Mage_CatalogSearch_Model_Resource_Fulltext an :

        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;
        }

Sie können sehen, dass es nur die LIKE-Ergebnisse hinzufügt, nachdem die FULLTEXT-Ergebnisse zurückgekehrt sind.


Dinge zu beachten

  1. Ich empfehle dringend, FULLTEXT zu verwenden, um eine bessere Leistung und relevante Ergebnisse zu erzielen
  2. Sehen Sie sich jedes Attribut an und überlegen Sie, ob es zum Volltextindex hinzugefügt werden muss ('In der Schnellsuche verwenden').
  3. Standardmäßig sind die Produktbeschreibungen in der FULLTEXT-Indexierung enthalten. Ich entferne fast immer die Beschreibungen, da sie die Relevanzwerte mit Wörtern verschmutzen, die in irrelevanten Kontexten verwendet werden.
  4. Stellen Sie sicher, dass Ihre Metaattribute im Volltextindex verwendet werden. Füllen Sie sie mit aussagekräftigen Inhalten.
  5. MySQL FULLTEXT hat einige Macken - es enthält eine Liste ignorierter Wörter, die problematisch sein können, wenn Ihre Produktnamen aus diesen Wörtern bestehen!
  6. MySQL ignoriert standardmäßig FULLTEXT- Abfragen mit weniger als 4 Zeichen . Attribute mit kurzen Werten werden ignoriert, sofern Sie diesen Wert nicht ändern.

Sie können die Punkte 5 und 6 mit der Combine-Methode umgehen - die LIKE-Ergebnisse sollten alle Wörter ausgleichen, die FULLTEXT ignoriert.

jharrison.au
quelle
7

Bei der Suche nach "Gefällt mir" wird die übliche Übereinstimmung mit "Gefällt mir" durchgeführt, wobei eine Abfrage wie "% keyword%" verwendet wird. Ein Vorteil dieser Art der Suche besteht darin, dass sie mit Teilwörtern übereinstimmt. Es hat jedoch schwerwiegende Nachteile:

  • wird schnell zu einem Leistungsproblem
  • Relevanz ist schlecht. In ähnlichen Abfragen gibt es eigentlich keinen Begriff von "Relevanz"

Die Volltextsuche funktioniert mit der MyISAM-Volltextsuche ( http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html ). Sie sollten darüber lesen, aber auf den Punkt gebracht:

  • Leistung ist besser
  • Stoppwörter (wie "und", "mit" usw.) werden ausgeschlossen.
  • Standardmäßig wird jedem Ergebnis eine Bewertung basierend auf der Relevanz zugewiesen

Der Nachteil von Volltext ist, dass er keine Teilübereinstimmungen ausführen kann, dh bei einer Suche nach "pho" wird "phone" nicht gefunden.

Die "kombinierte" Suche verwendet eine "Like" -Bedingung, um die Ergebnisse abzugleichen, berücksichtigt jedoch auch die Volltextsuche, um sie zu sortieren. Dies bedeutet, dass Sie mehr Ergebnisse erhalten (wie bei der Suche auch bei Teil-Übereinstimmungen) und diese aufgrund der Volltextbewertung auch besser sortiert werden.

Wie bereits erwähnt, sollten Sie Solr verwenden, wenn Sie die Suche ernst nehmen. Es ist viel schneller und viel relevanter. Sie müssten jedoch Magento EE besitzen und Solr selbst installieren.

Paul Grigoruta
quelle
1
Danke für diese Antwort. Warum brauche ich Magento EE?
PiTheNumber
1
Die Solr-Suche ist Teil von Magento Enterprise (kein Feature der Community). Es gibt Erweiterungen, die eine Suche in einer Community wie magentocommerce.com/magento-connect/solr-bridge-search.html implementieren . Ich habe sie aber nicht benutzt.
Paul Grigoruta
6

Es handelt sich um direkte Verweise auf den Abfragetyp, den Magento verwenden wird. Persönlich denke ich, dass die Volltextsuche leistungsfähiger und die Leistung besser ist, insbesondere wenn LIKE mit Platzhaltern (%) verwendet wird. Eine Kombination von beidem ist wahrscheinlich am genauesten, könnte aber übertrieben sein. Ich würde mich an den Volltext halten.

Wenn Sie jedoch nach einer leistungsstarken Suchlösung suchen, schauen Sie sich dieses Projekt an: https://code.google.com/p/magento-solr/ . SOLR wurde für das Durchsuchen großer Sammlungen entwickelt. Die Implementierung kann zwar einige Zeit in Anspruch nehmen, sollte sich jedoch lohnen. Persönlich habe ich es noch nie in Magento benutzt, aber in anderen PHP-Projekten lief es sehr gut.

Die Volltextdokumentation finden Sie hier: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html LIKE-Dokumentation hier: http://dev.mysql.com/doc/refman/5.0 /en/string-comparison-functions.html

Sander Mangel
quelle
Volltext ist leistungsfähiger, benötigt jedoch Setups in my.cnf, wenn die Ergebnisse für Wörter mit weniger als 5 oder 4 Zeichen angezeigt werden sollen, abhängig von der Standardeinstellung. Wie die Suche oft kaputt ausgeliefert wird und die Logik von OR auf AND geändert werden muss, damit nicht zu viele irrelevante Ergebnisse ausgegeben werden.
Fiasko Labs
Sie haben Recht mit Volltext. Ist immer klug, entweder auf einem VPS oder bei einem Unternehmen zu hosten, das Magento-Hosting anbietet. Optionen wie die Volltextkonfiguration sollten dann verfügbar sein, oder Sie können sie zumindest selbst einstellen. Haben Sie Suchvorschläge von Drittanbietern für @Fiasco Labs?
Sander Mangel
@FiascoLabs, wie änderst du das ORauf AND?
Michael Yaeger
3

Das Problem mit LIKE ist, dass standardmäßig "% term%" verwendet wird. Ich habe es so geändert, dass es mit "term%" übereinstimmt (beachten Sie das Leerzeichen vor dem Begriff), sodass es mit den Wortanfängen übereinstimmt. Ich habe auch die letzten "s" in einem Suchbegriff abgeschnitten, damit "Autos" die gleichen Ergebnisse wie "Auto" liefert. Offensichtlich hilft das nicht bei unregelmäßigen Substantiven wie "Kinder", aber es ist trotzdem eine enorme Verbesserung.

Die größte, aus unerklärlichen Gründen unsinnige Maßnahme von Magento ist die Verwendung der "ODER" -Suche anstelle von "UND". Wenn Sie nach "roten Autos" suchen, erhalten Sie alles Rote (einschließlich Autos, Hunde, Gabeln, Berghänge usw.) und jede Art von Auto (einschließlich Rot, Blau, Grün, Gelb usw.). Mit „AND“, erhalten Sie nur Elemente , die „rot“ und „Auto“ enthalten, das ist , wie Suche sollte funktionieren!

Wenn Sie aus der Antwort von jharrison.au zitieren, ändern Sie Folgendes:

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

Dazu:

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

Um die Relevanz Ihrer Suchergebnisse sofort und massiv zu steigern.

Für den Plural können Sie das letzte "s" eines Wortes wie dieses abhacken:

$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 können app/code/local/Mage/Core/Model/Resource/Helper/Abstract.phpSie die Kerndatei überschreiben und die public function escapeLikeValue($value, $options = array())als Schnellverknüpfung ändern , obwohl der empfohlene Weg ist, dasselbe in einem Modul zu tun. Aber hier ist es.

Darunter if (isset($options['position'])) {befindet sich ein Schalter. Ich habe die Groß- und Kleinschreibung für 'start' und 'end' geändert, um vor und nach dem Wert Leerzeichen einzufügen:

 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;

Damit die Leerzeichen davor / danach funktionieren, müssen Sie wahrscheinlich auch die Art und Weise ändern, in der der Suchindex erstellt wird, wie ich es getan habe, damit sichergestellt ist, dass vor und nach jedem Wort ein Leerzeichen steht. Die Standardmethode zum Erstellen des Index besteht darin, jedes Feld durch ein '|' zu trennen. (Pipe-Charakter), zB "blue | car | a very nice car" zur Indizierung von Farbe, Produkttyp, Produktbeschreibung. Aber mein Index hat "blue | car | a very nice car". Sie können den Aufbau des Suchindex sogar so ändern, dass möglicherweise mit Bindestrich versehene Wörter ersetzt werden ("superschnelles Auto" wird zu "superschnelles Auto") usw. usw.

Ausleihen eines Beispiels aus der Antwort von jharrison.au, wobei ein Standardsuchindexfeld wie folgt aussehen würde:

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

Meins würde so aussehen:

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

(Leerzeichen vor und nach jedem "|" und "/" und ein Leerzeichen vor dem allerersten Wort)

Buttle Butkus
quelle
1
Sie haben erwähnt, zu überschreiben app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php. Diese Datei wird nur für die Suchfunktion verwendet.
Amitshree
1
@amitshree Gute Frage. Ich weiß es nicht genau. Es könnte von jeder Modellressource für Suchergebnisse verwendet werden, nehme ich an. Dies ist jedoch speziell für das Ausweichen LIKEin SQL-Suchanfragen gedacht. Wo sucht Magento anders als im Produktsuchindex? Ich habe diese Änderung vor über 2 Jahren in einer Produktionsstätte vorgenommen, und wir haben überhaupt keine diesbezüglichen Fehler gefunden. Alles, was es wirklich tut, ist, es so zu machen, dass ein "Wortanfang" ein Leerzeichen vor sich haben muss und ein "Wortende" ein Leerzeichen danach haben muss. Unabhängig davon stelle ich im Index sicher, dass jedes Wort mit Leerzeichen versehen ist.
Buttle Butkus
2

In keinem der oben genannten Fälle können Sie die integrierte Zend Lucene-Suchmaschine verwenden, indem Sie so etwas wie Blast Lucene Search oder Extendeware Lucene Search installieren. Die Relevanz übertrifft alle MySQL-Angebote.

Ja, ich habe alle Iterationen der akzeptierten Antwort durchgearbeitet, aber ehrlich gesagt fehlte die Suche nach Optimized Stock Magento immer noch sehr.

Lucene hingegen liefert und ist bereits in der Magento-Installation enthalten, es wird lediglich ein Modul benötigt, um es zu aktivieren.

Fiasco Labs
quelle