Es ist weitgehend bekannt, dass Oracle TEXT eine Ähnlichkeitssuche
mit dem Fuzzy-Operator unterstützt. Die einfachste Variante
ist die Verwendung des Fragezeichens ?. Der Fuzzy-Operator
ist gut geeignet, um mit etwaigen Rechtschreibfehlern in den Dokumenten
umzugehen. Sucht man bspw. nach ?Spatial, so findet der Index
auch Dokumente, in denen fälschlicherweise "Sptial" geschrieben wurde.
select dateiname, score(0) from dokumente where contains (content, '?Spatial', 0) > 0
Diese Ähnlichkeitssuche kann übrigens auch parametrisiert werden: Neben
dem Fragezeichen steht auch das Schlüsselwort FUZZY zur Verfügung. Oder
anders ausgedrückt: Obige SQL-Abfrage ließe sich auch so schreiben:
select dateiname, score(0) from dokumente where contains (content, 'FUZZY(Spatial, 60, 100, N)'), 0) > 0
Und mit diesen Parametern kann man das Verhalten des FUZZY-Operators nun steuern. Der
erste Parameter legt fest, wie ähnlich die Tokens im Dokument dem Suchbegriff
sein müssen. Erlaubt sind Werte von 1 bis 80. Je niedriger Ihr den Wert ansetzt, desto
mehr Begriffe kommen in Frage; desto mehr Dokumente werden also gefunden. Allerdings
stellt sich die Frage, wie relevant die Dokumente bei sehr niedrigen Grenzen noch sind.
Der zweite Parameter legt fest, wieviele Werte überhaupt in die Termexpansion
einbezogen werden. Dazu kurz einige Worte: Oracle TEXT führt die Fuzzy-Suche über eine
Termexpansion durch; es werden also zunächst aus der Token-Tabelle ($I) die
ähnlichen Tokens herausgesucht (der erste Parameter legt, wie gesagt, fest, wie ähnlich
die Tokens sein müssen). Mit den so gefundenen Tokens wird dann eine ODER Suche
durchgeführt.
Mit dem zweiten Parameter legt man also fest, wieviele ähnliche Wörter
maximal einbezogen werden sollen. Erlaubt sind Werte zwischen 1 und 5000. Ein Wert
von 20 würde bewirken, dass maximal 20 ähnliche Wörter in der Suche berücksichtigt werden,
auch wenn anhand des ersten Parameters mehr in Frage kämen. Hier gilt also: Je höher der
Wert gesetzt wird, desto mehr Dokumente werden tendenziell gefunden ...
Der letzte Parameter wirkt sich nur auf den Score aus, den ein Dokument im Relevanz-Ranking
bekommt. Mit einem W werden die Scores anhand der Ähnlichkeit der Suchwörter gewichtet;
mit einem N geschieht das nicht. Ein W führt zu tendenziell höheren Scores.
Mit diesen Parametern könnt Ihr also spielen, um mit der Fuzzy-Suche mehr oder
weniger Ergebnisse zu bekommen. Was konkret gebraucht wird, hängt von den
Anforderungen des Projekts ab ... zur Verdeutlichung hier nochmals zwei
Extrembeispiele. Das erste ist zwar "formal" eine Ähnlichkeitssuche, aber die
Parameter "würgen" die Fuzzy-Logik weitgehend ab.
select dateiname, score(0) from dokumente where contains(content, 'fuzzy(sptial, 80, 1, W)',0) > 0;
Das zweite bohrt die Grenzen
so weit auf, dass sehr viele Dokumente in Frage kommen ...
select dateiname, score(0) from dokumente where contains(content, 'fuzzy(sptial, 1, 5000, W)',0) > 0;
Dies lässt sich auch sehr gut mit
Query Relaxation
verbinden. In einer ersten Stufe würde ohne den Fuzzy-Operator suchen, in einer nächsten
Stufe dann mit dem Fuzzy-Operator, aber eher restriktiven Kriterien und danach mit sehr
weit gehenden Parametern. Query Relaxation arbeitet die Stufen dann bekanntlich so lange
ab, bis genügend Treffer gefunden sind - mehr dazu im Blog Posting.