我发现越来越多的用户在我的网站上注册,只是为了向其他用户发送重复的垃圾邮件消息。我添加了一些服务器端代码来使用以下 mysql 查询检测重复消息:
SELECT count(content) as msgs_sent
FROM messages
WHERE sender_id = '.$sender_id.'
GROUP BY content having count(content) > 10
该查询运行良好,但现在他们通过更改消息中的一些字符来解决这个问题。有没有办法用 MySQL 来检测这一点,或者我是否需要查看从 MySQL 返回的每个分组,然后使用 PHP 来确定相似性的百分比?
有什么想法或建议吗?
全文匹配
你可以考虑实施类似的东西MATCH
例子here http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html:
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
index.
What is score
在这个例子中?
It is a relevance value
。它是通过以下描述的过程计算的:
集合和查询中的每个正确单词都经过加权
根据其在收集或查询中的重要性。
因此,出现在许多文档中的单词具有较低的
重量(甚至可能为零重量),因为它具有较低的
该特定集合中的语义价值。相反,如果这个词
很罕见,它的权重更高。单词的权重是
组合起来计算行的相关性。
来自文档 http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html page.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)