我有一个MySQL表,其中包含一个坏词列表(bad_words),并且我想在文本字段(public_message)中扫描该字段中的坏词数量。 bad_words中大约有1100个条目
我尝试过包含,但是只看一个字。
类似这样的事情:
SELECT public_post_id, count(word)
FROM public_posts
WHERE public_message CONTAINS (SELECT word FROM bad_words)
我知道这种语法是错误的,但这就是我想要实现的目的。
最终输出应为每个public_message中的多个坏词。我不关心此时有哪些单词,有没有,还有多少。
答案 0 :(得分:0)
您可以这样做:
SELECT p.public_post_id, COUNT(*)
FROM public_posts p JOIN bad_words b
ON public_message LIKE CONCAT('%', b.word, '%')
但是它的性能会令人难以置信。它将必须进行等于public_posts
中的行数{{1}中的行数 bad_words
中的1,100个字的搜索。
MySQL具有全文索引功能,但不适用于您的情况。
https://dev.mysql.com/doc/refman/8.0/en/fulltext-restrictions.html说:
AGAINST()的参数必须是在查询评估期间恒定的字符串值。例如,这排除了表列,因为每一行的表列可能不同。
换句话说,您不能这样做:
SELECT ...
FROM public_posts p JOIN bad_words b
ON MATCH(p.public_posts) AGAINST(b.word) -- ERROR!
您可以一次搜索一个单词,但随后需要1100个查询。
或者您也可以通过在AGAINST表达式中列出许多单词来使用全文索引:
SELECT ...
FROM public_posts p
WHERE MATCH(p.public_posts) AGAINST('word1 word2 word3 word4 word5...' IN BOOLEAN MODE)
很多单词可能是您通过查询bad_words
表生成的列表。
但是,这并不能告诉您每个单词的匹配次数,只是告诉您帖子中至少包含一个匹配单词。
此外,我不确定是否有长度限制,或者是否可以将所有1100个不好的单词做成一个字符串。
我不知道还有其他全文搜索实现方式可以更好地解决此问题。