我看到越来越多的用户在我的网站上注册,只是向其他用户发送重复的垃圾邮件.我添加了一些服务器端代码来检测具有以下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示例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;
请注意,要使用这些函数,您的内容列必须是FULLTEXT索引.
这个例子中得分是多少?
这是一个相关价值.它通过下面描述的过程计算:
Every correct word in the collection and in the query is weighted
according to its significance in the collection or query.
Consequently, a word that is present in many documents has a lower
weight (and may even have a zero weight), because it has lower
semantic value in this particular collection. Conversely, if the word
is rare, it receives a higher weight. The weights of the words are
combined to compute the relevance of the row.
从documentation页面.