Phonetische Suche im SQL Server mit LinQ

Hat man eine Anwendung erstellt, egal ob Webseite oder Desktopclient, ist eine Suche meist obligatorisch. Aber da fangen die Probleme gerade erst an. Man möchte ja nicht immer auf identische Schreibweise achten besonders, wenn auch noch diakritische Zeichen in den zu durchsuchenden Texten verwendet wurde.
Es gibt mal wieder viele Lösungsmöglichkeiten, welche aber auch von den zur Verfügung stehenden Mitteln abhängen. Nicht immer gibt es einen vollwertigen SQL Server, der eine Volltextsuche mitbringt. Das ist sozusagen der Königsweg. Damit kann man so ziemlich alle Fälle und Anforderungen abdecken. Aber darum soll es heute nicht gehen.
Im SQL Server, auch schon ab der Express Version, ist der SoundEx-Algorithmus implementiert. Der ist zwar für die englische Sprache entwickelt wurden und berechnet die Werte ziemlich grob, reicht aber für die meisten Belange aus.

Wie kann man diesen Algorithmus nun mit Linq einsetzen?

Möchte man Einträge aus einer Tabelle suchen, kann man im ersten Schritt eine SQL-Anweisung mit dem Aufruf des Algorithmus machen. Im SQL Server gibt es zwei Funktionen, welche den Algorithmus umsetzen. Mit SOUNDEX(value) wird der Scorewert berechnet. Mit DIFFERENCE(valueA, valueB) wird ein Vergleich der Werte durchgeführt. Das Ergebnis ist eine Ganzzahl zwischen 0 und 4. Mit 4 wird die größte Übereinstimmung der Werte angezeigt, 0 hingegen zeigt an, dass gar keine Ähnlichkeit vorhanden ist.
Die SQL-Anweisung könnte nun folgendermaßen aussehen.
[sql]
SELECT id FROM myTable WHERE DIFFERENCE(colA, @search) >=3
[/sql]
Damit werden alle ID-Werte der Tabelle myTable selektiert, welche eine Übereinstimmung von 3 oder 4 nach der DIFFERENCE-Funktion mit dem Suchwert und den Werten aus der Spalte colA haben. Danach hat man also ein Array von Id-Werten in der Hand und kann damit die Entitäten mittels Linq laden. Dazu übergibt man die Werte in der Expression wie folgt.
[csharp]
//Abfragen der IDs
var resultIds = Context.MyTable.SqlQuery(sql, parameter).Select(p => p.Id).ToList();
//laden der Entities
var results = Context.MyTable.Where(x => resultIds.Contains(x.Id));
[/csharp]

Somit hat man sehr einfach eine praktikable phonetische Suche ohne großen Aufwand geschrieben. Und dazu noch mit frei erhältlichen Mitteln.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s