使用MySQL检测垃圾邮件发送者

时间:2012-02-15 02:19:31

标签: php 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来确定相似性的百分比?

有任何想法或建议吗?

1 个答案:

答案 0 :(得分:3)

全文匹配

您可以考虑实施与MATCH示例here类似的内容:

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。它通过下面描述的过程计算:

  

对集合和查询中的每个正确单词进行加权   根据其在集合或查询中的意义。   因此,许多文档中出现的单词较低   重量(甚至可能没有重量),因为它有较低的重量   此特定集合中的语义值。相反,如果这个词   很少见,它的重量更高。单词的权重是   结合起来计算行的相关性。

documentation页面。