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

Mysql 搜索数据库中列表中出现的单词的文本输入,mysql,full-text-search,Mysql,Full Text Search,我有一个MySQL表,其中有一个坏单词列表bad_words,我想扫描一个文本字段public_message,查找该字段中坏单词的数量。大约有1100个坏词条目 我试过包含,但只看一个词 大概是这样的: 选择公共发布id,countword 来自公共部门的职位 其中公共消息包含从坏单词中选择单词 我知道这种语法是错误的,但这正是我试图实现的要点 最后的输出应该是每个公共消息中的一些坏单词。我不关心此时使用哪些词,只要有,以及有多少个词。您可以这样做: SELECT p.public_post_

我有一个MySQL表,其中有一个坏单词列表bad_words,我想扫描一个文本字段public_message,查找该字段中坏单词的数量。大约有1100个坏词条目

我试过包含,但只看一个词

大概是这样的: 选择公共发布id,countword 来自公共部门的职位 其中公共消息包含从坏单词中选择单词 我知道这种语法是错误的,但这正是我试图实现的要点

最后的输出应该是每个公共消息中的一些坏单词。我不关心此时使用哪些词,只要有,以及有多少个词。

您可以这样做:

SELECT p.public_post_id, COUNT(*)
FROM public_posts p JOIN bad_words b
  ON public_message LIKE CONCAT('%', b.word, '%')
但它的性能会非常糟糕。它必须进行大量的搜索,搜索的行数等于公共文章中的行数乘以坏单词中的1100个单词

MySQL有一个全文索引功能,但它不适合您的情况

说:

要针对的参数必须是在查询计算期间保持不变的字符串值。例如,这排除了表列,因为每行的表列可能不同

换句话说,你不能这样做:

您可以一次搜索一个单词,但这样就需要1100个查询

或者,您可以使用全文索引,在表达式中列出许多单词:

SELECT ...
FROM public_posts p
WHERE MATCH(p.public_posts) AGAINST('word1 word2 word3 word4 word5...' IN BOOLEAN MODE)
许多单词可以是通过查询bad_words表生成的列表

但这并没有告诉你每个单词的匹配数,只是文章至少包含一个匹配的单词

另外,我不确定是否有长度限制,或者是否可以将所有1100个坏单词组成一个字符串


我不知道还有哪种全文搜索实现能更好地处理这个问题。

您需要在MySQL中安装全文搜索扩展。您特别推荐哪一种?谢谢您的详细回复。如果我们换一种方式呢?也就是说,一次只搜索一篇公开帖子中的坏话?这也会有同样的问题。
SELECT ...
FROM public_posts p
WHERE MATCH(p.public_posts) AGAINST('word1 word2 word3 word4 word5...' IN BOOLEAN MODE)