Intereting Posts
Запрос веб-сайта по сценарию на стороне клиента = Скрипт с перекрестным скриптом. Но запрашивать веб-сайт по сценарию на стороне сервера – это не взлом! Зачем? Фиксация / захват сеанса PHP Как я получу следующий день недели? Сортировка массива слов – неанглийские буквы + двойные буквы символов PHP php iconv translit для удаления акцентов: не работает как исключено? защита изображений в кодеринговом Почему этот скрипт API Twitter не работает? Запрос AJAX от строк таблицы к деталям Как изменить текстовое поле на видимое в зависимости от того, какой элемент выбран в раскрывающемся меню? Как изменить водяной знак пользовательского поиска Google Какое лучшее решение для получения следующего и предыдущего месяца с данной даты php Обновление старых сохраненных паролей md5 в PHP для повышения безопасности PHP exif_read_data больше не извлекает местоположение GPS Как удалить повторяющиеся ссылки со страницы, кроме первой Как пользователь автоматически выйдет из всех открытых вкладок, когда пользователь выйдет из одной из них

Обнаружение спамеров с помощью MySQL

Я вижу, что все большее число пользователей регистрируются на моем сайте, чтобы просто отправлять дублирующиеся сообщения SPAM другим пользователям. Я добавил код на стороне сервера, чтобы обнаружить повторяющиеся сообщения со следующим запросом mysql:

SELECT count(content) as msgs_sent FROM messages WHERE sender_id = '.$sender_id.' GROUP BY content having count(content) > 10 

Запрос работает хорошо, но теперь они обходятся, изменяя несколько charctersr в своих сообщениях. Есть ли способ обнаружить это с помощью MySQL или мне нужно посмотреть на каждую группу, возвращаемую из MySQL, а затем использовать PHP для определения процента сходства?

Любые мысли или предложения?

Полнотекстовый матч

Вы можете посмотреть на реализацию чего-то похожего на пример MATCH :

 mysql> SELECT id, body, MATCH (title,body) AGAINST -> ('Security implications of running MySQL as root') AS score -> FROM articles WHERE MATCH (title,body) AGAINST -> ('Security implications of running MySQL as root'); +----+-------------------------------------+-----------------+ | id | body | score | +----+-------------------------------------+-----------------+ | 4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 | | 6 | When configured properly, MySQL ... | 1.3114095926285 | +----+-------------------------------------+-----------------+ 2 rows in set (0.00 sec) 

Итак, для вашего примера, возможно:

 SELECT id, MATCH (content) AGAINST ('your string') AS score FROM messages WHERE MATCH (content) AGAINST ('your string') AND score > 1; 

Обратите внимание, что для использования этих функций колонка вашего content должна быть индексом FULLTEXT .

Что такое score в этом примере?

Это relevance value . Он вычисляется с помощью процесса, описанного ниже:

Каждое правильное слово в коллекции и в запросе взвешивается в соответствии с его значением в коллекции или запросе. Следовательно, слово, которое присутствует во многих документах, имеет более низкий вес (и может даже иметь нулевой вес), потому что оно имеет более низкое семантическое значение в этой конкретной коллекции. И наоборот, если слово встречается редко, оно получает больший вес. Весовые слова объединяются для вычисления значимости строки.

На странице документации .