Back to top

Die Magie des Query Parsing

Einfach ausgedrückt übersetzt ein Query Parser den Suchbegriff in konkrete Anweisungen für die Suchmaschine. Er steht also zwischen dem Benutzer und den gesuchten Dokumenten und spielt damit eine zentrale Rolle für den Abruf der Texte. Fantastisch, wenn alles funktioniert, aber auch oft frustrierend. 

Einige Query Parser folgen strikt Typ A. Das heißt, sie sind geradezu fanatisch auf Details fixiert und extrem stur. Du suchst nach allen Dokumenten, in denen die Wörter A und B vorkommen, mit nicht mehr als 5 anderen Wörtern dazwischen? Kein Problem. Hier, bitte. 

Andere Query Parser sind viel entspannter und flexibler. Du brauchst alle Dokumente mit den Wörtern A und B? Also, ich hab hier ein paar ganz passable Dokumente mit beiden Wörtern, und hier hinten noch ein paar, die auch ganz nett aussehen, in denen aber nur A oder B vorkommt... Immer mit der Ruhe, Mann. 

Die besten Query Parser verstehen den Content und handeln wie Suchexperten im Auftrag des Benutzers. Du willst alle Dokumente mit A und B haben? Hier, bitte, ich habe sie dir so sortiert, dass diejenigen, bei denen A und B im Titel vorkommen, ganz oben stehen. Gerne geschehen. 

Man sollte dabei am besten den Query Parser einsetzen, der am besten zur Persönlichkeit der Benutzer passt. Ein bisschen wie bei Haustieren und Besitzern. Die Arten von Abfragen, die von Bibliothekaren, Rechtsanwälten oder Wissenschaftlern eingegeben werden, sind komplett anders als die von Tante Helen und Onkel Erich. Nichts ist frustrierender für einen Benutzer als ein Query Parser, der nicht seine Sprache spricht. 

Leider bieten die meisten Suchprodukte keine Flexibilität in der Abfragesprache. Das ist recht frustrierend und nicht wirklich weitsichtig. Viele Projekte, an denen ich gearbeitet habe, mussten daher ihren eigenen Query Parser schreiben. Manche waren recht einfach (füge ~0,85 am Ende jedes Worts hinzu), manche sehr komplex (vollständige boolesche Sprache mit verschachtelten Ausdrücken und Bereichssuchen). In fast jedem Fall gibt es eine Form der Vorverarbeitung, ehe die Abfrage an die Suchmaschine weitergeleitet wird. 

Was kann der Query Parser also alles bieten? Erstellen wir eine Liste: 

 

1. Bestimmen, wonach gesucht wird

Der erste Schritt der Abfrageverarbeitung ist es, die Wörter zu bestimmen, nach denen gesucht werden soll. Das ist nicht so einfach, wie es sich anhört. 

Zumindest muss der Query Parser bestimmen, was genau der Suchbegriff ist. Ist F-150 ein einzelner Suchbegriff oder zwei Begriffe? Ist der Bindestrich wichtig? Passt auch F150? Und was passiert, wenn "F-150" von Anführungszeichen eingefasst wird? Ist dann etwas anderes gemeint? 

Natürlich müssen alle diese Entscheidungen mit Bezug zum Indexer getroffen werden. Der Query Parser kann nur nach Begriffen suchen, die der Indexer indexiert hat. Man kann also gerne nach +/- 5 Kilometern suchen, aber höchstwahrscheinlich sind die Zeichen "+/-" nirgendwo vom Index erfasst. 

 

2. Die Query Language selbst parsen 

Natürlich muss der Query Parser die Query Language selbst auch parsen. Das bedeutet, dass er Operatoren (AND, OR, +, -, NOT usw.), Gruppierungs-Operatoren und Feldeinschränkungen erkennen und interpretieren muss. 

Selbst Google kann Abfragen wie die Folgende ausführen: 

musik -video (sänger OR band) site:amazon.de 

Je nach Endnutzer kann die Sprache der Abfrage sehr einfach (einige Suchbegriffe, eventuell Ausdrücke in Anführungszeichen) oder recht komplex (komplette boolesche Syntax mit verschachtelten Ausdrücken, Umgebungs-Operatoren und gewichteten Begriffen) sein. Oder, sie kann ein frustrierend inkonsistenter Hybrid sein – wie in Lucene. 

 

3. Zugang zu Funktionen der Suchmaschine bieten 

Einige Query Languages waren nie für die Nutzung durch Endnutzer vorgesehen. Zu diesen gehören Oracle Text und FAST FQL. Diese Sprachen sind vielmehr dazu gedacht, von Programmierern genutzt zu werden, um auf alle Funktionen der Suchmaschine zuzugreifen. 

Idealerweise sollten alle Funktionen, die von der Suchmaschine verarbeitet werden können, auch irgendwie verfügbar sein. Leider ist das oft nicht der Fall, ohne die Suchmaschine anzupassen. Zum Beispiel gibt es in der Lucene Query Engine viel (viel!) mehr Suchfunktionen, als durch die Lucene Query Syntax ausgedrückt werden können. Wenn diese zusätzlichen Funktionen genutzt werden sollen, muss dafür ein eigener Query Parser erstellt werden. 

 

4. Verwandte Sachen suchen

Sollen bei einer Suche nach "Stuhl" auch Ergebnisse für "Stühle" gefunden werden? Wenn man nach "Maus" sucht, sollen auch "Mäuse" gefunden werden? 

Die Suche kann so ziemlich komplex werden. Ein Benutzer sucht nach "Bergbau Untertage" und findet auch Ergebnisse für "Kammer-Pfeiler-Bau".  Ähnlich findet eine Suche nach "Sphalerit" auch "Zinkblende" (und umgekehrt). Solche Abfragen helfen unbedarften Endnutzern, vertikal gestreut innerhalb von Fachgebieten zu suchen, in denen sie sich nicht zu gut auskennen. 

Dabei sollte man auch unscharfe Suchen ("Fuzzy") nicht vergessen. Wenn die Daten besonders unsauber sind, sind diese Suchfunktionen von essentieller Bedeutung. So haben wir etwa letzte Woche bei einem Kunden 14 Varianten des Worts "Kawasaki" gefunden, darunter Begriffe wie "akawasaki", "kawasawki" und "hawasaki". 

 

5. Unterstützung bei Relevanzbewertung  

Als Übersetzer muss der Query Parser oft Anpassungen an der eingegebenen Abfrage vornehmen, um bessere Dokumente als Ergebnis abrufen zu können. So können beispielsweise Dokumente, in denen die Suchbegriffe im Titel oder in der Zusammenfassung vorkommen, als relevanter eingestuft werden. 

Es gibt viele Tricks und Techniken für die Relevanzbewertung, die der Query Parser nutzen kann, solange die zugrundeliegende Suchmaschine leistungsfähig genug ist. So kann ein Query Parser beispielsweise Dokumente hervorheben, bei denen alle Suchbegriffe in direkter Nähe zueinander vorkommen (Umgebungs-Gewichtung), oder Dokumente von bevorzugten Websites, während Dokumente von nicht bevorzugten Websites zurückgestellt werden. 

Wenn dann auch noch Kontrolle darüber geboten wird, wie die Dokumente indexiert werden, ist alles machbar. Damit können dann fortgeschrittene Möglichkeiten genutzt werden, um beispielsweise bestimmte Seiten zu bevorzugen, Dokumente zu bevorzugen, die erst kürzlich publiziert wurden, Dokumente zu bevorzugen, die bestimmte domänenspezifische Terminologie enthalten oder detaillierte Kontrolle darüber auszuüben, welche Arten von Abfragen als starke Treffer für bestimmte individuelle Dokumente gewertet werden. 

So haben wir beispielsweise bei GPO FDsys festgelegt, dass zitierte Dokumente als stärkster Faktor für die Suche genommen werden. Wenn also die Nummer der jeweiligen Gesetzesvorlage bekannt ist, kann man sie als Abfrage eingeben: "h.r. 3962, 111th congress" – damit kommt man dann direkt zum richtigen Ergebnis. 

 

Zusammenfassung 

Ich hoffe, dieser kleine Ausflug in die Welt der Query Parser und ihrer Möglichkeiten hat Ihnen gefallen. Ich persönlich finde sie faszinierend – wie ein kleines Fläschchen schwarze Magie. Einen eigenen Query Parser zu erstellen ist natürlich keine leichte Aufgabe, aber wenn man es einmal geschafft hat, kann man die Abfragen zum Tanzen bringen.

 

--Paul

0