我看到越来越多的用户在我的网站上注册,只是为了向其他用户发送重复的垃圾邮件。我添加了一些服务器端代码,用于使用以下mysql查询检测重复消息:
SELECT count(content) as msgs_sent
FROM messages
WHERE sender_id = '.$sender_id.'
GROUP BY content having count(content) > 10查询运行得很好,但现在他们通过更改消息中的一些字符来绕过这个问题。有没有办法用MySQL检测到这一点,或者我需要查看从MySQL返回的每个分组,然后使用PHP来确定相似性百分比?
有什么想法或建议吗?
发布于 2012-02-15 10:31:35
全文匹配
您可以考虑实现类似于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页面。
https://stackoverflow.com/questions/9287061
复制相似问题