Ich habe eine etwas kniffilge Aufgabe bei der ich gerne mal ein paar Meinungen und Vorschläge hören würde.
Ausgangspunkt ist folgender:
Ich habe eine Tabelle mit Einträgen, diese Einträge können getagged werden. In einer Suchmaske sollen Suchwörter eingegeben werden und gesucht werden. Der Eintrag der am besten passt soll dann ausgegeben werden.
Es gibt zwei Tabellen
Eine Tabelle mit Einträgen sieht ungefähr so aus
EntryID, EntryName,...
Eine zweite Tabelle mit den zugehörigen Tags sieht so aus
TagID, EntryID, TagName
es ist eine 1:n verknüpfung auch wenn eine n:m Verknüpfung (zwei 1:n) vielleicht etwas besser der Normalform entspräche, musste ich etwas den Aufwand gegen Nutzen aufwägen, daher hab ich mich bewusst (wenn auch nicht ganz mit reinem Gewissen) dagegen entschieden.
Mein Momentaner Stand ist folgendes SQL Statement
Das Statement ist etwas vereinfacht und funktioniert soweit auch
select e.*, COUNT(t.EntryID) as Counting FROM entries e, tags t where e.EntryID= t.EntryID AND (t.TagName = 'suchwort1' OR TagName = 'suchwort2') GROUP BY t.EntryID ORDER BY Counting DESC
Ich bekomme jetzt die Datensätze auf die mindestens ein Suchwort zutrifft und natürlich die Trefferanzahl vom größten zum kleinsten Sortiert.
1. Frage: Um die Trefferwahrscheinlichkeit zu erhöhen würde ich gerne gewisse Zeichen wie Punkt, Komma, Bindestrich ignorieren. Gibt es eine möglichkeit z.b. den Datenbankeintrag A.B.C finden zu lassen wenn das Suchwort abc ist?
Zusätzlich will ich aber noch zusätzlich eine Ähnlickeitssuche mit levenshtein machen (eine entsprechende Prozedur hab ich im Internet schon gefunden und eingefügt, sodass man es ggf im SQL Statement verwenden kann), um z.b. vertipper etwas zu kompensieren. eine notlösung wäre halt die vertipper ebenfalls als tags zu speichern, was zwar funktioniert und leicht umzusetzen ist aber meiner meinung nach nicht die schönste lösung ist.
ich hab mir also gedacht, dass man es vielleicht mit einer Art Scoringverfahren machen könnte, welches dann den Datensatz mit der höchsten Punktzahl zurückgeben würde.
Mein Ansatz wäre etwas im Hunderterbereich zu machen. Quasi jeder Direkte Treffer würde 100 Punkte geben und je größer das Verhältnis zwischen Wortlänge und Lev Distanz ein kleineren Satz, danach entweder summieren und schauen.
2. Frage lässt sich sowas überhaupt in Mysql umsetzen? oder ist es doch eher besser wenn man es von php machen lässt, da die Datenmenge nicht überdimensional wird, würde es notfalls gehen.
3. Frage kann man sowas komplexes mit Storedprocedures berechnen lassen. Das Problem wäre ja die Auswertung von Selectstatements und ich hab mir erstmal ein paar Grundlagen angesehen.
Frage 1 (weiter oben) wäre übrigens eine sehr wichtige frage, damit schon recht gut zumindest die möglichkeiten einschränken kann
Ausgangspunkt ist folgender:
Ich habe eine Tabelle mit Einträgen, diese Einträge können getagged werden. In einer Suchmaske sollen Suchwörter eingegeben werden und gesucht werden. Der Eintrag der am besten passt soll dann ausgegeben werden.
Es gibt zwei Tabellen
Eine Tabelle mit Einträgen sieht ungefähr so aus
EntryID, EntryName,...
Eine zweite Tabelle mit den zugehörigen Tags sieht so aus
TagID, EntryID, TagName
es ist eine 1:n verknüpfung auch wenn eine n:m Verknüpfung (zwei 1:n) vielleicht etwas besser der Normalform entspräche, musste ich etwas den Aufwand gegen Nutzen aufwägen, daher hab ich mich bewusst (wenn auch nicht ganz mit reinem Gewissen) dagegen entschieden.
Mein Momentaner Stand ist folgendes SQL Statement
Das Statement ist etwas vereinfacht und funktioniert soweit auch
select e.*, COUNT(t.EntryID) as Counting FROM entries e, tags t where e.EntryID= t.EntryID AND (t.TagName = 'suchwort1' OR TagName = 'suchwort2') GROUP BY t.EntryID ORDER BY Counting DESC
Ich bekomme jetzt die Datensätze auf die mindestens ein Suchwort zutrifft und natürlich die Trefferanzahl vom größten zum kleinsten Sortiert.
1. Frage: Um die Trefferwahrscheinlichkeit zu erhöhen würde ich gerne gewisse Zeichen wie Punkt, Komma, Bindestrich ignorieren. Gibt es eine möglichkeit z.b. den Datenbankeintrag A.B.C finden zu lassen wenn das Suchwort abc ist?
Zusätzlich will ich aber noch zusätzlich eine Ähnlickeitssuche mit levenshtein machen (eine entsprechende Prozedur hab ich im Internet schon gefunden und eingefügt, sodass man es ggf im SQL Statement verwenden kann), um z.b. vertipper etwas zu kompensieren. eine notlösung wäre halt die vertipper ebenfalls als tags zu speichern, was zwar funktioniert und leicht umzusetzen ist aber meiner meinung nach nicht die schönste lösung ist.
ich hab mir also gedacht, dass man es vielleicht mit einer Art Scoringverfahren machen könnte, welches dann den Datensatz mit der höchsten Punktzahl zurückgeben würde.
Mein Ansatz wäre etwas im Hunderterbereich zu machen. Quasi jeder Direkte Treffer würde 100 Punkte geben und je größer das Verhältnis zwischen Wortlänge und Lev Distanz ein kleineren Satz, danach entweder summieren und schauen.
2. Frage lässt sich sowas überhaupt in Mysql umsetzen? oder ist es doch eher besser wenn man es von php machen lässt, da die Datenmenge nicht überdimensional wird, würde es notfalls gehen.
3. Frage kann man sowas komplexes mit Storedprocedures berechnen lassen. Das Problem wäre ja die Auswertung von Selectstatements und ich hab mir erstmal ein paar Grundlagen angesehen.
Frage 1 (weiter oben) wäre übrigens eine sehr wichtige frage, damit schon recht gut zumindest die möglichkeiten einschränken kann
Kommentar