Das Thema Suche habe ich bei mir im Shop schon ausführlich bearbeitet und Ansätze gefunden, wie ich das Finde-Verhalten der Suche erheblich verbessern konnte. Wir hatten unter anderem damit zu kämpfen, dass Redakteure in Produktbeschreibungen und Kunden bei der Suche die Schreibweise von (gesuchten) Produkten erheblich variieren.
In unserem Fall der Sporternährung sollten die Suche nach
- Energiegel
- Energygel
- Energie Gel
- Energy Gel
- Energie-Gel
- Energy-Gel
- Energiegäl
- Ennergie Gehl usw.
mehr oder weniger zu vergleichbaren Ergebnissen führen.
Dies habe ich in einem mehrstufigen Ansatz gelöst:
a) Ich habe mir eine zusätzliche Datentabelle
products_searchdata angelegt, in der ich in einer einzigen Tabelle alle relevanten Suchdaten in einem einzigen Datensatz pro Shop-Artikel zusammenfasse.
Hier liegen dann quasi "Duplikate" von products_short_description, products_description etc. - und zusätzlich auch neu zusammengestellte Daten wie die eine Aneinderreihung aller Produkt-Attribute, die mit einem Artikel verknüpft sind. Wenn ich also bei einem Artikel "Hersteller X - Energiegel" als auswählbares Produktattribut "Geschmacksrichtung" die Attributwerte "Orange", "Zitrone", "Apfel" habe, so fülle ich dann in meiner Zusatztabelle products_searchdata das Feld "
products_autoattributes" mit der Zeichenkette "orange zitrone apfel". Damit kann ich also auch effizient nach Attributwerte, ohne aufwändige SQL-Joins mit den Tabellen products_attributes, products_options und products_options_values machen zu müssen.
Die Datentabelle
products_searchdata erzeuge ich einmal täglich neu per Cronjob - oder aktualisiere den Datensatz jeweils für ein Produkt, wenn dieses Produkt in der Artikelverwaltung gespeichert wird.
Meine Suche durchsucht nicht mehr die eigentlichen Produktdaten, sondern nur noch die Suchtabelle
products_searchdata.
b) Die zweite Maßnahme ist eine spezielle Behandlung der Produktdaten vor der Abspeicherung in
products_searchdata. Stichworte: Stemming und Phonetische Repräsentation.
Bei Stemming wird ein Wort auf seinen Wortstamm zurückgeführt. Beispiel:
Aus
- "Herren"
- "Herrn"
- "Herrs"
- "Herrens"
- "Herrns"
wird einfach "Herr". So bekommt man die unterschiedlichen Schreibweisen eines Begriffs in den Griff - sowohl in den Produktbeschreibungen wie später auch bei den Begriffen, die ein Shopbesucher in die Suche eintippt.
Für solche Stemming-Geschichten gibt es den Porter-Stemmer-Algorithmus:
https://de.wikipedia.org/wiki/Porter-Stemmer-AlgorithmusFür das Stemming existieren fertige PHP-Bibliotheken wie z.B. der Snowball Stemmer. Wenn ich also meine products_short_description, products_description in der Tabelle
products_searchdata abspeichere, haben sie vorher den Stemming-Prozess durchlaufen. Deshalb wird also nur noch die Grundform aller Begriffe aus einem Text gespeichert - und später auch nur noch gesucht, da ich die Suchbegriffe eines Nutzers vor der Suchabfrage ebenfalls durch den Stemmer laufen lassen.
c) Maßnahme Nummer 3 ist die phonetische Behandlung. Wörter werden in Zahlencodes überführt. Dazu benutze ich die für die Sprache Deutsch die Kölner Phonetik
https://de.wikipedia.org/wiki/K%C3%B6lner_Phonetik Ziel dieses Verfahrens ist es, gleich klingenden Wörtern denselben Code zuzuordnen, um bei Suchfunktionen eine Ähnlichkeitssuche zu implementieren. Damit ist es beispielsweise möglich, in einer Namensliste Einträge wie „Meier“ auch unter anderen Schreibweisen, wie „Maier“, „Mayer“ oder „Mayr“, zu finden. Aus "
Müller-Lüdenscheidt" wird dann bei mir 6050750206802
Für die Kölner Phonetik findet man im Internet ebenfalls fertige PHP-Module, die man mit wenig Anpassungsaufwand nutzen kann.
Ich erstelle also für alle Inhalte aus Datenfeldern wie products_short_description, products_description phonetische Repräsentationen - und mache dann mit den Sucheingabe den Nutzers dasselbe. Dann suche ich also mit der phonetischen Wiedergabe des Suchbegriffs im phonetischen Datenbestand.
d) Dies bringt uns zu Punkt 3: Zur Volltextsuche. Für meine Suchdatentabelle
products_searchdata habe ich mit MySQL-Bordmitteln einen Volltextindex angelegt. Dadurch erfolgt die Suche ziemlich performt - und es erspart mir, selbst einen Suchindex erstellen zu müssen.
e) Die Daten in
products_searchdata durchlaufen zusätzlich noch einige Aufbereitungsschritte, die ich bislang nicht erwähnt habe:
1) Stopwörter / Füllwörter werden weggefiltert. Dazu benutze ich die Stop-Wort-Liste und Go-Wort aus dem Modul für die automatischen Metatags: "aber, achten, alle, allein, allen, allem, allerdings, alles, als, andere, anderen, anderer, anderes, ändern, anders, angesichts, anstatt, auch, auf, aufgrund, aus, außerdem...."
2) Wörter mit Bindestrich werden zerlegt und daraus neue zusätzliche Begriffe zusammengesetzt. Beispiel Steht irgendwo in einer Produktbeschreibung "Energie-Riegel" so werden daraus gleich drei neue Begriffe, die ich dem Text hinzufüge: "Energie", "Riegel" (jeweils einzeln) und "Energieriegel".
3) Produktattributwerte wie "Geschmacksrichtung: Zitrone" sind noch mit Synonymen wie "Lemon", "Zitrus" usw. verschlagwortet, die bei der automatischen Erzeugung von Suchtexten aus den Attributen ebenfalls berücksichtigt und für den jeweiligen Artikel in der Tabelle
products_searchdata mit abgespeichert werden. So erscheint dann bei einer späteren Suche nach "Lemon" auch das Zitronen-Produkt als Treffer, obwohl dieser Begriff gar nicht im Artikelnamen oder in der Artikelbeschreibung enthalten ist.
f) Für die Sortierung der gefunden Artikel habe ich mir ein Relevanz-Ranking gebastelt. Es beruht darauf, ob die Originalschreibweise der Suchbegriffe eines Nutzers auch tatsächlich in der Originalschreibweise der Artikeldaten vorkommt. Je größer diese Übereinstimmung ist, desto weiter oben erscheint ein Produkt in der Trefferliste der Suche.
Durch die phonetische Suche kommt es zum Teil durchaus zu Treffern, die man sich nicht direkt erklären kann. Aber dies ist in der Praxis nicht schlimm, solange die relevanten Treffer ganz oben in der Liste stehen. Letztlich kennt jeder Nutzer dies aus Suchmaschinen wie Google: Du erhältst 2 Millionen Treffer - schaust aber nur die ersten 10 davon an. Welcher "Unsinn" auf Seite 4 oder 27 der Trefferliste steht, ist für Dich völlig egal.
Wer meine Suche einmal ausprobieren möchte, bitteschön:
https://www.ausdauerleistung.de/advanced_search_result.php?keywords=energiegelIch denke, dass ich meine Ziele ganz brauchbar erreicht habe:
- Für die meisten üblichen Suchanfragen in unserem werden tatsächlich Treffer anzeigt (und nicht "Kein Artikel gefunden").
- Relevante Suchergebnisse erscheinen am Anfang der Trefferliste
- Die Performance der Suche ist akzeptabel (Antwortzeiten < 1,5 sec)
- Unterschiedliche (oder gar falsche) Schreibweisen von Suchbegriffen führen trotzdem zu ähnlichen / brauchbaren Ergebnissen
- Für die Shop-Admins entsteht kein Zusatzaufwand für das manuelle Hinzufügen zusätzlicher Suchbegriffe. Der Shop erledigt dies automatisch.
An der Umsetzung des skizzierten Konzepts habe ich etwa zwei Wochen gewerkelt. Ich denke, dass dies für das erzielte Resultat ein recht vertretbarer Aufwand war.
[
EDIT Tomcraft 27.02.2023: Beitrag abgetrennt von "
MODUL: t10: Suchbegriffstatistik für Shopversion 2.x".]