在文本输入中搜索数据库中列表中单词的出现

时间:2019-04-22 20:39:12

标签: mysql full-text-search

我有一个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中的多个坏词。我不关心此时有哪些单词,有没有,还有多少。

1 个答案:

答案 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个不好的单词做成一个字符串。

我不知道还有其他全文搜索实现方式可以更好地解决此问题。