Trefferquote ermitteln

bartman336

Mitglied
Hi Leute,
ich hab hier grade mal nen Problem und vielleicht kann mir ja einer von euch helfen. Und zwar würde ich gerne bei einer Suche innerhalb einer MySql DB (bzw Tabelle) eine art Trefferqoute ermitteln sprich ich habe zum Beispiel folgende Einträge

Code:
id   | titel 
1    | a b c
2    | b e
3    | d c a
4    | e b c

und möchte jetzt gerne (mit einer "oder" verknüpfung) nach den Einträgen "e c" suchen.
Das funktioniert ja auch soweit, allerdings bekomme ich dann die ergebnisse in der Reihenfolge in der er sie findet. (order by titel)

Ergebnis:
1. a b c
2. b e
3. d c a
4. e b c

Wobei ich eigentlich den Eintrag mit der
höchsten Trefferqoute brauchen würde also "e b c", aber die Anderen wo nur ein Suchbegriff drin vorkommt nicht vernachlässigen kann.

Hat irgendeiner von euch eine "einfache" Idee? Mir fallen nämlich im Moment nur Zwei ein, die etwas kompliziert sind.

Idee Nr. 1:
Das Ergebnis Array nochmal komplett durchsuchen und die Häufigkeiten der Wörter zu einer Zahl addieren und dann anhand dieser Zahl das Array sortieren.
(oder geht das vielleicht schon direkt mit Mysql?)

Idee Nr. 2:
Ähnlich wie eine Forensoftware (vbulletin macht das zum Beispiel)
einen Suchindex anlegen und dann
mit diesem Index die Ergebnisse suchen.

Naja vielleicht fällt euch ja dazu was ein bevor ich mich wieder an die Arbeit mache (ist ja bei dieser Hitze nicht zu ertragen, tagsüber zu arbeiten *g*)
 
Dazu kannst du die Volltextsuche von MySQL verwenden. Vorraussetzung ist, dass du für die betreffenden Felder der DBTabelle einen Volltextindex anlegst, was nur bei VARCHAR und TEXT möglich ist.

Wenn das aber klappt, macht MySQL alles allein, nämlich mit

Code:
SELECT * FROM <tabelle> WHERE MATCH (<Feld>) AGAINST ('<Suchbegriff_1> <Suchbegriff_2>');

MySQL sortiert dann automatisch nach der Häufigkeit der Suchbegriffe. Allerdings dürfte dann 3x"c" weiter oben stehen als {1x"c" 1x"e"}, bin mir da aber absolut nicht sicher.

EDIT:
Achtung: MySQL sucht nur nach ganzen Wortübereinstimmungen. Wenn du also nach "objektorientiert" suchen willst, dann findet MySQL "objektorientierte" oder "objektorientiertes" NICHT. Außerdem muss ein Wort für MySQL mindestens drei Zeichen lang sein.

EDIT 2:
Das ganze hat aber auch noch einen recht interessanten Aspekt. MySQL liefert nicht nur die geforderten Einträge, sondern außerdem eine Wichtung der gefundenen Einträge. Um diese zu verwenden, musst du jedoch die MATCH-Klausel in die SELECT-Klausel verlegen:
Code:
SELECT *, MATCH (<Feld>) AGAINST ('<Suchbegriff_1> <Suchbegriff_2>') FROM <tabelle>


Gruß
Falk
 
Zuletzt bearbeitet:
andernfalls kannst du noch die LIKE-Klausel nehmen.

Aber wieder soll gesagt sein: es gibt nen MySQL-Forum wo das reingehört ;)
 
Quatsch! Die Logik eines Rankingsystems hat doch nicht nur etwas mit SQL zu tun.

Ich würde erstrangig überprüfen, wie viele der eingegebenen Schlagworte im Dokument vorkommen. Wird also nach a und b gesucht, so kommt die Seite im Ranking höher, die a und b beinhaltet. Danach kommen erst die Seiten, in denen nur a oder b vorkommt. (Und-Verknüpfungen sind höherwertiger als Oder-Verknüpfungen). Das sollte der ausschlaggebende Faktor sein.

Um nun die Seiten besser sortieren zu können, die nach der ersten Sortierung auf gleicher Stufe stehen, würde ich nun nach der Häufigkeit der einzelnen Schlagworte im Dokument sortieren.

Es ist zwar auf den ersten Blick nicht die gewünschte unkomplizierte Variante, doch je komplexer ein Ranking-System ist, um so größer ist die Qualität des Suchsystems. Deine User werden's Dir danken.

mfg, snuu
 
Und zwar würde ich gerne bei einer Suche innerhalb einer MySql DB (bzw Tabelle) eine art Trefferqoute ermitteln sprich ich habe zum Beispiel folgende Einträge

Hat irgendeiner von euch eine "einfache" Idee? Mir fallen nämlich im Moment nur Zwei ein, die etwas kompliziert sind.

Er wollte eine einfache Variante, ich glaube die Volltextsuche von MySQL reicht vollkommen aus. Ich würde es nicht unnötig komplizierter machen. MySQL bietet eigentlich schon von haus her sehr gute suchmöglichkeiten. Ich weiß nicht wozu das am ende dienen soll und obs wirklich gebraucht wird, das noch weiter auszuwerten, aber die mysql-möglichkeiten sind doch recht vielversprechend
 

Neue Beiträge

Zurück