Ähnlichkeitssuche: Die "Kölner Phonetik" in APEX
Erscheinungsmonat |
APEX-Version |
Datenbankversion |
August 2013 |
alle |
ab 10.2 |
In einer APEX-Anwendung ist die Suche in einem Bericht etwas völlig normales;
interaktive und klassische Berichte werden von APEX typischerweise direkt mit
Suchfunktion bereitgestellt. Bereits in der Vergangenheit sind in der APEX-Community
Tipps zu den Themen
Case- und Umlaut-Insensitive Suche sowie
Ähnlichkeitssuche (unscharfe Suche) erschienen. Heute
geht es um einen, für den deutschsprachigen Raum relevanten, Spezialfall der Ähnlichkeitssuche:
Dieser Tipp zeigt, wie man die Kölner Phonetik in der Datenbank implementieren und in
einer APEX-Anwendung nutzen kann.
Nach dem
Wikipedia-Eintrag ist die
Kölner Phonetik ein "phonetischer Algorithmus, der Wörtern nach ihrem Sprachklang eine Zeichenfolge zuordnet, den phonetischen Code. Ziel dieses Verfahrens ist es,
gleich klingenden Wörtern denselben Code zuzuordnen, um bei Suchfunktionen eine
Ähnlichkeitssuche zu implementieren. [...]".
Der Algorithmus der Kölner Phonetik ordnet den Buchstaben eines Wortes Zahlenwerte zu,
und zwar abhängig davon, wo die Buchstaben im Wort stehen und welche Buchstaben jeweils
vorher und nachher zu finden sind. Die Tabelle mit den Zuordnungsregeln ist ebenfalls
im Wikipedia-Artikel zu finden. Diese lässt sich nun recht einfach in eine
PL/SQL Funktion übersetzen - wie folgt:
Auf Github ist
eine weitere Implementierung von Andy Theiler
zu finden. Im Gegensatz zu der hier vorliegenden setzt diese anstelle von INSTR und SUBSTR
auf die REGEXP-Funktionen der Datenbank. Inhaltlich arbeiten beide gleich; die hier vorliegende
dürfte, da sie auf die REGEXP-Funktionen verzichtet, jedoch etwas schneller in der Ausführung sein.
Die Funktion FUNC_PHONETIK kann nun getestet werden ...
Der Algorithmus liefert, wie gewünscht, für (in der deutschen Sprache) gleich
klingende Worte, gleiche Zahlenwerte zurück. Hat man nun eine Tabelle mit
Kundennamen, so lässt sich die Ähnlichkeitssuche darauf wie folgt umsetzen:
So kann eine Ähnlichkeitssuche funktional bereits umgesetzt werden. Bei großen
Datenmengen braucht es aber noch eine Indexunterstützung, denn ein jedesmal stattfindender
Full Table Scan würde die Anwendung sichtlich verlangsamen.
Wie schon im Tipp zum Thema
Case- und Umlaut-Insensitive Suche werden wir
also als nächstes einen Funktionsbasierten Index erstellen.
Der Ausführungsplan zeigt nun, dass auch die "phonetische Suche" nun
indexunterstützt abläuft - auch bei großen Datenmengen wird die Suche nun
performant sein.
Mit diesen Vorbereitungen geht es nun an die Nutzung in einer APEX-Anwendung.
Legen Sie also eine Anwendungsseite mit einem
klassischen Bericht an. Die Seite sollte etwa wie Abbildung 1 aussehen.
Abbildung 1: Klassischer APEX-Bericht - erstellt mit dem Assistenten
Navigieren Sie dann zur Berichtsquelle und ändern Sie die SQL-Abfrage
wie folgt um:
Starten Sie die Seite danach neu. Nun funktioniert die Berichtssuche
als Ähnlichkeitssuche.
Abbildung 1: Der Bericht bietet nun eine Ähnlichkeitssuche nach der Kölner Phonetik
Leider funktioniert das automatische Hervorheben des Suchbegriffs in den Daten
nur für exakte Treffer. Schön wäre es ja, wenn man auch sehen würde, welche
Daten per Ähnlichkeitssuche zu einem Treffer geführt haben. Dazu muss die SQL-Abfrage nochmals
angepasst werden.
Stellen Sie dann die beiden Berichtsspalten FIRST_NAME und LAST_NAME in den
Spaltenattributen auf Standardberichtsspalte um, damit die HTML-Tags vom Browser
auch interpretiert werden. Um damit keine Sicherheitslöcher für Cross-Site-Scripting Attacken zu öffnen, werden die
Inhalte der beiden Spalten in der SQL-Abfrage mit SYS.HTF.ESCAPE_SC maskiert. Das Umstellen der Spalten auf
Standardberichtspalte ist damit ungefährlich.
Abbildung 3: Berichtsspalten FIRST_NAME und LAST_NAME auf "Standardberichtsspalte" umstellen
Danach kann der Bericht wie folgt aussehen. Rot bedeutet nun, dass ein exakter Treffer vorliegt,
Grün bedeutet, dass der Treffer dem Suchbegriff nach der Kölner Phonetik ähnlich ist.
Wenn Sie für die Ausgabe noch ein "Maß" für die Ähnlichkeit benötigen, so können Sie ab Oracle11g Release 2 das
PL/SQL-Paket UTL_MATCH verwenden. Die darin befindlichen Funktionen
EDIT_DISTANCE bzw. JARO_WINKLER geben Ihnen eine Kennzahl
für die Ähnlichkeit zurück, nach welcher dann absteigend sortiert werden kann ...
Abbildung 4: Ähnlichkeitssiche in APEX: Nun mit Markierung der Treffer
Dass man anstelle der hard kodierten HTML-Tags im SQL natürlich auch mit CSS-Klassen oder
Templates arbeiten kann, versteht sich von selbst. Beachten Sie jedoch, dass die Kölner Phonetik tatsächlich
nur im deutschsprachigen Raum sinnvoll ist. In anderen Sprachen sind die Treffer,
die man erhalten wird, nur wenig sinnvoll. Eine sinnvolle Erweiterung dürfte auch
sein, dass der Endanwender die Ähnlichkeitssuche per Checkbox aktiviert - möchte
jemand explizit "scharf" suchen, ist das dann immer noch möglich.
Zurück zur Community-Seite
|