phpbar.de logo

Mailinglisten-Archive

[php] Doppelte ähnliche Texte abfangen?

[php] Doppelte ähnliche Texte abfangen?

Yannik Hampe yannik at cipher-code.de
Don Nov 30 00:18:17 CET 2006



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...
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.

> 
>> Zusätzlich solltest du wahrscheinlich noch im Where anführen, ob die
>> Nachricht auch vom gleichen Benutzer kam. Denn es gibt bestimmt auch
>> ähnliche PNs, die immer wieder zwischen irgendwelchen Benutzern
>> versendet werden.
> 
> Die generelle Gefahr, auch bei der Benutzereinschränkung ist, daß 
> eigentlich unterschiedliche PMs wegen nur marginaler Unterschiede 
> plötzlich als zu ähnlich erkannt und abgelehnt werden. Konkret: Ein 
> Nutzer schreibt einem anderen eine lange PM. Der Nutzer antwortet mit 
> Vollzitat nur ein Wort: "OK.". Und darauf antwortet dann wieder der 
> andere mit "Gut.". In diesem Fall wir die errechnete 
> Ähnlichkeitsprozentzahl sehr hoch sein und auch noch denselben Benutzer 
> treffen. Trotzdem sind die PMs inhaltlich keine Variation ein und 
> derselben PM.
> 
>> Performancemässig würde ich sagen, dass dies eine wesentlich
>> schneller Lösung ist, als die vorgeschlagenen php-Lösungen.
>> Aber wirklich schnell ist MATCH dann trotzdem noch nicht. Du solltest
>> diese Prüfungen am besten nur dann machen, wenn das schon die 3. PN
>> des Benutzers in der Stunde ist oder irgend sowas...
> 
> 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.
> 
> 
> Viele Grüße
> Lutz

Yannik

php::bar PHP Wiki   -   Listenarchive