phpbar.de logo

Mailinglisten-Archive

[php] Doppelte ähnliche Texte abfangen?

[php] Doppelte ähnliche Texte abfangen?

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Don Nov 30 05:49:01 CET 2006


Hi Yannik,

Am Donnerstag, 30. November 2006 00:18 schrieb Yannik Hampe:
> Lutz Zetzsche wrote:
> > Hi Yannik,
> >
> > Am Mittwoch, 29. November 2006 15:35 schrieb Yannik Hampe:
> >> Ich gehe mal davon aus, du benutzt MySQL...
> >>
> >> Du könntest auf die Textspalte erstmal einen Fulltext legen.
> >> Dann kannst du mit
> >> SELECT MATCH(spalte) AGAINST (text) AS relevanz FROM ...
> >> Von MySQL einen Wert errechnen lassen, anhand dessen du
> >> einschätzen kannst, ob es diese Nachricht schonmal gab.
> >> Je höher der Wert in relevanz, je wahrscheinlicher ist es eine von
> >> deinen Spams.
> >
> > wenn er mit dem kompletten Text der neuen PM sucht und dieser nicht
> > exakt so irgendwo existiert, wird er auch keine Treffer bekommen,
> > d.h. Du wirst gar nicht erst dahin kommen, die Relevanz auslesen zu
> > können. ;-) Also entweder habe ich Deinen Ansatz nicht verstanden,
> > oder er ist logisch falsch. :-)
>
> Also entweder du hast noch nie MySQLs Fulltext-Funktion benutzt / den
> Sinn verstanden, oder du verwendest eine andere MySQL-Version als ich
> oder wir reden sonstwie gerade aneinander vorbei...
>
> Bevor ich hier zuviel Müll erzähle habe ich das gerade nochmal
> schnell in MySQL 5.0.27 getestet:
> INSERT INTO testtab (wert) VALUES ('blubb menno grummel')
> SELECT MATCH(wert) AGAINST ('blubb menno grummel') FROM testtab
> -> 2.010093300802
> SELECT MATCH(wert) AGAINST ('blubb menno grummel asdfjhj') FROM
> testtab -> 2.010093300802
> SELECT MATCH(wert) AGAINST ('blubb menno') FROM testtab
> -> 1.3400622005347
> SELECT MATCH(wert) AGAINST ('pfffffttttt') FROM testtab
> -> 0
>
> Wenn man nach exakt gleichen Texten sucht, wäre der Fluutextindex ja
> nicht soinderlich sinnvoll...

ich denke, wir reden etwas aneinander vorbei. :-)

Wenn Du in Deinem Beispiel mit 'blubb menno' suchst, ist ja noch alles 
ok, aber was ist, wenn der Suchtext 'blubb menno grummel asdfjhj' 
oder 'bllubb menno' ist? Dann klappt Dein Ansatz nicht mehr, wenn ich 
jetzt nicht etwas Fundamentales übersehen habe. Das meinte ich. Denke 
nur mal an die diversen Buchstaben, die in die Betreffs von Spam-Mails 
eingebaut werden, nur damit das Wort mal so und mal so geschrieben ist.


> Man kann mit IN BOOLEAN MODE auch noch ganz viel mehr tolle Sachen
> mit dem Fulltext machen. Aber das macht das statement langsamer und
> ist hier auch unnötig.

Nach meiner Beobachtung ist MATCH ... AGAINST ... IN BOOLEAN MODE bei 
langen und nie gleichen Texten mit Volltextindex langsamer als ohne.


> > Die vorgeschlagenen PHP-Lösungen sind vermutlich erstens langsam
> > und zweitens schwerlich praktikabel, weil erst einmal stapelweise -
> > teilweise sicherlich etwas längere - PMs aus der Datenbank gezogen
> > und dann mit den Funktionen analysiert werden müssen. Sind gerade
> > viele Benutzer gleichzeitig online, kann man damit sicherlich eine
> > hübsche Last auf dem System erzeugen.
> >
> > Bei der Datenmenge, die man bei 35.000 Nutzern in der Datenbank
> > vermuten kann, wird MATCH ... AGAINST ... allerdings mit Sicherheit
> > auch sehr langsam sein.
>
> Ich habe ja schon gesagt, dass es nicht der Performancerenner ist.
> Aber schneller als alles andere bisher vorgeschlagene ist es
> bestimmt. Zumindest verwende ich MATCH AGAINST in einem Webshop und
> in der Testdatenbank durchsuche ich die 7,7 MB Tabelle mit 27k
> Artikeln in unter 0,02 Sekunden.
> Zugegeben mit nur einem Suchwort, aber trotzdem eine beachtliche
> Leistung. Dass kann keine php-Funktion auch nur im Ansatz leisten, da
> diese nicht auf die Optimierungen von Fulltext zugreifen können.
> Ein einfaches SELECT, welches alle Daten aus der DB holt, dauert
> dabei schon über eine Sekunde (also 50 mal so langsam) und dann ist
> noch nichts verglichen und php darf anfgangen nochmal langsam zu
> sein.

Eine Lösung datenbankseitig wäre sicherlich theoretisch schneller, wobei 
ich aber nicht weiß, ob das dann auch in der Praxis bei vielen 
gleichzeitigen Benutzern auf einer Community-Website so wäre 
(Flaschenhals Datenbankverbindung).

Der Haken ist aber, daß ich bisher in MySQL kein Konstrukt und keine 
Funktion gefunden habe, die das macht, was Andreas sucht. Das MATCH ... 
AGAINST ... setzt die exakte Schreibweise voraus, und SOUNDEX() ist die 
einzige MySQL-Funktion, die ich finden konnte, wo man mit Ähnlichkeiten 
arbeiten könnte. Die Funktion paßt aber wieder nicht wirklich auf die 
Aufgabenstellung und hat auch Einschränkungen: Arbeitet derzeit nur in 
der englischen Sprache korrekt und kann Probleme bei UTF-8-Zeichen 
bekommen.


Viele Grüße
Lutz

php::bar PHP Wiki   -   Listenarchive