Datenbanksuche - "meinten Sie vielleicht: ..."

splat

Erfahrenes Mitglied
Hallo,
ich verwende folgende Funktion um meine Datenbank zu durchsuchen:

PHP:
$qid = db_query("
	SELECT
		 p.id AS pid
		,p.name
		,p.artikelnr
		,p.sichtbar
		,p.bauart
		,c.id AS cid
	FROM products p, products_categories pc, categories c
	WHERE (lower(p.name) LIKE '%$search%' OR lower(p.artikelnr) LIKE '%$search%')");

das klappt soweit alles wunderbar. Jetzt würde ich gerne eine 2. Funktion hinzufügen, die dann aufgerufen wird, sobald nichts gefunden wurde. In der Art: "meinten Sie vielleicht: (ähnliche Artikel)". Gibt es einen Befehl, Stichwörter zu vergleichen? Oder müsste ich eine extra Tabelle mit Stichwörtern zum ausweichen anlegen:
wenn Stichwort1 --> anzeigen von Stichwort2

Wie wird so etwas realisiert?

MfG,
Marc
 
Es gibt keinen Befehl, sowas zu implementieren, genauso wenig, wie es einen Befehl gibt, den nächsten 3D-Spielehit für Sommer 2005 zu generieren :D

Du willst in der Datenbank Sachen finden, die ähnlich sind. Wie ist das in Sachbüchern geregelt, wenn man etwas sucht? Da gibt es einen Index hinten. Also quasi das, was du als "zweite Tabelle mit Stichwörtern" bezeichnest! Eine Datenbank ist halt nur dann wirklich leistungsfähig, wenn Metadaten existieren, also Relationen zwischen den einzelnen Einträgen.

Wenn du die Rechtschreibung korrigieren willst, sieht das Problem wieder anders aus. Dann solltest du u.U. auf Klangfunktionen zurückgreifen, die den Klang der Wörter miteinander vergleichen und auf diese Art und Weise ähnliches Material zurückliefern. Hier hilft z.B. soundex().

-Gawayn
 
Zuletzt bearbeitet:
Danke für deine Antwort Gawayn :)

soundex() hört sich ja schonmal gut an.. Ich werde mir mal in der Praxis ansehen, wie genau das arbeitet und ob das zu gebrauchen ist, ansonsten muss ich wohl dann auf den Index zurückgreifen :(

Die eine Sache wären halt die Rechtschreibfehler, das andere wären Zahlendreher in der Artikelnr. Momentan bekomme ich alle gescheiterten Suchanfragen per Mail zugeschickt und die Rechtschreibfehler/Zahlendreher kommen schon ziemlich häufig vor. :rolleyes: Mit den Zahlendrehern in der ArtikelNr muss ich mir wohl noch irgendwas einfallen lassen.

soundex() funktioniert für die deutsche und englische Sprache?

Gruß, Marc
 
Mein letzter Kenntnisstand ist, dass soundex() leider nur für Englisch funktioniert. Allerdings meine ich mich zu erinnern, dass der Algorithmus gar nicht so schwierig ist, man ihn also durchaus für Deutsch implementieren könnte.

Die Zahlendreher sind etwas schwieriger. Als Lösung denke ich da in erster Linie an eine mathematische Lösung. Du könntest z.B. deine Nummern einem bestimmten Format folgen lassen. Sollte nun die Nummer in der DB nicht existieren, besteht die Möglichkeit, eine Fehlerkorrektur vorzunehmen, so dass du aus der fehlerhaften die korrekte Nummer berechnen kannst. Dafür darf nicht jedes Bit der Nummer informationstragend sein.

Spontan käme ich auf folgende, sehr einfache Idee: Du hast einen String, der die Artikelnummer angibt. Wie treten Dreher normalerweise auf? Indem man nebeneinander liegende Ziffern vertauscht. Das heißt, du könntest z.B. sagen, dass du nicht mit dem Dezimalsystem arbeitest, sondern mit einem 3er-System, wobei die Dezimalziffern 1,2,3 die erste Ziffer des 3er-Systems sind, die 4,5,6 die zweite Ziffer und die 7,8,9 die dritte Ziffer. Auf diese Art kommt Redundanz ins Spiel: Wenn der Benutzer zwei Ziffern vertauscht, z.B. schreibt er anstatt 78 die 87, dann ist das immer noch dieselbe Artikelnummer, weil 7 und 8 ja dieselbe Ziffer im 3er-System bedeuten. Problematisch wird es nur, wenn der User die Grenzziffern vertauscht. Allerdings hättest du, denke ich zumindest, eine Menge Fehler schon verhindert.

Wenn du nun eine 8-stellige Artikelnummer verwendest, erhältst du dadurch 3^8=6561 verschiedene Artikelnummern. Das reicht doch, oder? Vielleicht ließe sich die Sicherheit noch erhöhen, indem du außer Zahlen noch Buchstaben verwendest.

-Gawayn
 
Bei Buchstaben-/Zahlendrehern könnte auch die [phpf]levenshtein[/phpf]-Funktion interessant werden:

Diese Funktion errechnet die Differenz zwischen den als Argumente übergebenen zwei Strings. Ist einer der Strings länger als die zulässigen 255 Zeichen, wird -1 zurück gegeben.

Die Levenshtein-Differenz ist definiert als die minimale Anzahl an Zeichen, die ersetzt, eingefügt oder gelöscht werden müssen um den str1 nach str2 umzusetzen.
 
Zurück