Techniken und deren SuchperformanceIm Folgenden möchte ich mich mit der Volltext-Suche ansich beschäftigen.
Grundlegend stellt SQL mehrere Möglichkeiten der Suche zur Verfügung:
Natural Language Search:Die Natural Language Search durchsucht die Datenbank mit einem gewissen Spielraum in Form von verbalem Interpretierungsfreiraum.
Die Varianzen zwischen gleichklindenen Wörtern wird zu unterdrücken versucht. Zum Beispiel:
[Aus den Daten von den Tests zum Speicherverbrauch]
Besonderheit | Query | Suchergebnis |
---|
Doppelkonsonanten | tippsy | tipsy |
s und z | tipzy | tipsy |
y und i | tipsi | tipsy |
Wortzusammensetzungen | ill | ill-humored / ill-equipped |
Die Ergebnisse sind nicht zu 100% gleich, aber der Interpretationsfreiraum wird ziemlich gut ausgeglichen.
SQL:SELECT * FROM sentences WHERE MATCH(text) AGAINST('yummy cake')
Dieser Query berechnet die Relevance (einen Wert, der angibt wie genau der Suchtext mit dem zu vergleichenden Text in der Datenbank überein stimmt), lässt alle Rows mit der Relevance 0 wegfallen und sortiert die übrig bleibenden nach absteigender Relevance.
(Der Query wird automatisch sortiert, da das Matching in der WHERE-Clause steht)Um den Relevance-Wert auszulesen (z.B. zum Testen oder um ihn im Ergebnis anzuzeigen) kann man ihn mit dem folgenden SQL mit ausgeben lassen:
SELECT text, MATCH(text) AGAINST('yummy cake') AS relevance FROM sentences WHERE MATCH(text) AGAINST('yummy cake')
(Auch wenn das MATCH AGAINST zweimal im Query steht erzeugt dieser Befehl nicht viel mehr Overhead als der obere. Da es sich um 2 identische Matches handelt wird nur ein MATCH AGAINST berechnet)
Boolean Search Mode:Der Boolean Mode ist eine Erweiterung der Natural Language Search.
Achtung! Beim Testen ist mir zufällig aufgefallen, dass der Boolean Mode mit MyISAM anders arbeitet als mit InnoDB (auf einer MariaDB). Wie sich InnoDB auf MySQL (ab V5.6.x) verhält habe ich nicht getestet.Er erlaubt das benutzen von Modifiern im Suchstring, wie zum Beispiel (Es gibt noch einige mehr):
(Bei InnoDB gibt es ein paar Dinge zu beachten: Referenz)Modifier | Effekt | Beispiel | Result-Example |
---|
+ | Wort muss enthalten sein | +linux | Auf Servern läuft meist: Linux |
- | Wort darf nicht enthalten sein | -windows | Antivirus für Windows installieren |
* | Wort muss so anfangen | politi* | Politik / Politiker / politisch |
Da es bei der Verwendung dieser Modifier zu Syntax-Fehlern beim Query kommen kann ist deren Verwendung zwar (bei validem Query) einfach super für erfahrenere Benutzer, der User spielt dann allerdings den wichtigsten Faktor. Sucht ein Nutzer beispielsweiße nach einem Text der ein "+" enthält wird es trotzdem als Modifier interpretiert. Ein Beispiel dafür:
Kaffee + Kuchen
Das Ergebnis
muss Kuchen enthalten und kann
Kaffee beinhalten.
Bei der Verwendung von + und - ist (
Mutmaßung - ohne jeglichen Beweiß!) eventuell eine Geschwindigkeits-Steigerung zu beobachten, da Rows sofort als unpassend parkiert werden können ohne weitere Berechnungen auszuführen, sollten Wörter vor bzw. nicht vorkommen die ausdrücklich ausgeschlossen oder erwünscht wurden.
SQL:Um ein Query im Boolean-Mode durchzuführen fügt man lediglich ein IN BOOLEAN MODE am Ende des Suchstrings im ASSIGN() an:
SELECT * FROM sentences WHERE MATCH(text) AGAINST('yummy cake' IN BOOLEAN MODE)
Hinweis: Das Natural Query ignoriert Modifier im Suchstring (keine Auswirkung auf das Ergebnis), da die Zeichen der Modifier (+ / - / ...) zumeist eh als Delimiter-Zeichen gesehen werden.
Search with Query Expansion:Die Query Expansion ist ein Verfahren um Synonymen bei der Suche Herr zu werden, deswegen lässt sich dieses Verfahren nur mit sinnvollen Test-Daten untersuchen.
Da ich zufälligerweise die Gelegenheit dazu hatte das mit Produktiv-Daten zu testen kann ich sagen, dass die Ergebnisse doch erstaunlich gut sind (Vorausgesetzt ist eine gute Stopword-Liste!) und nahezu an die Suchergebnisse mit von Hand eingetragenen Synonymen heranreicht.
Da die Suche allerdings mehrere Durchläufe ausführt (laut
Dokumentation 2) um ihr Ziel zu erreichen ist ihre Verwendung "durstiger" als die der Anderen. Die Ergebnisse allerdings bei korrektem Setup unschlagbar.
SQL:SELECT * FROM sentences WHERE MATCH(text) AGAINST('yummy cake' WITH QUERY EXPANSION)
Diese unterschiedlichen Möglichkeiten der Suche lassen sich natürlich beliebig kombinieren. Verwendet man allerdings im selben Query zwei unterschiedliche Suchmethoden werden beide einzeln berechnet, sie sind nicht voneinander ableitbar.
Fazit: Ohne die Verwendung von Modifiern dürften sich Default Mode (Natural Language) und Boolean Mode Geschwindigkeitstechnisch nicht viel geben. (Boolean könnte etwas schneller sein, da er ein paar Dinge per Design ignoriert, siehe:
Referenz)
Obwohl die zusätzliche Funktionalität des Boolean Mode usability-technisch durchaus Spaß machen kann, wird sie für Normalnutzer vermutlich hauptsächlich Kopfschmerzen bereiten.
Sollten die Suchergebnisse im Natural Language Mode keine allzu guten Ergebnisse liefern, lohnt sich sicherlich mal ein Blick auf die Query Expansions. Bei den (aktuell - 02.01.2015) rund 5500 Foreneinträgen und damit 5500 zu durchsuchenden Titeln dürfte der Unterschied (noch) nicht spürbar sein.
Beitrag wurde zuletzt am 02.01.2015 05:07 geändert.