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 06:56:29 CET 2006



Lutz Zetzsche wrote:
> 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.

Perfekt ist der Ansatz natürlich nicht. Aber es geht doch um Leute, die
gleich hunderten anderen Benutzern PNs schicken. Wenn die sich echt für
jede einzelne PN hinsetzen und mindestens 50% der Wörter abändern... Und
das bei jeder von den hunderten von PNs,... dann haben die viel Arbeit.
Wenn sich jemand so viel Mühe gibt und man will dem noch kontern, dann
wäre vielleicht eine richtige antispam-Software wie es bei mailserver
üblich ist angebracht.
Aber in dem Fall halte ich das für overkill.
> 
> 
>> 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.

Sag ich doch.
> 
> 
>>> 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).

Da php und mysql wahrscheinlich auf einer und der selben Hardware laufen
bringt es auch nichts die Last auf php zu verlegen...
Viele Daten werden bei der Methode auch nicht übertragen...
> 
> 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.

Mangel an Alternativen ;-).
SOUNDEX ist nebenbei auch noch viel langsamer als MATCH (gibt es ja
nicht als Index...).
> 
> 
> Viele Grüße
> Lutz

Yannik

php::bar PHP Wiki   -   Listenarchive