通常我们在进行模糊查询时,都是通过SQL语句的Like来查询的,例如搜索文章标题中带“苹果”两个字的,就搜索 where title like ‘%苹果%’这样来得到结果。
但有些时候用户输入的是一句话,例如用户输入:都挺好第一集,而数据库中对应的文章标题可能是:《都挺好》第一集,因为加了书名号的原因,通过like来模糊搜索就搜索不到了。
解决办法就是使用全文检索。

 

添加全文索引

将title字段设置为FULLTEXT索引
如果是英文检索,默认已经可以使用了,因为英文单词是通过空格来分隔的,然后中文没有分隔,都是连一起的,所以就需要分词。

设置最小分词索引长度

首先查询当前的分词索引长度,如果没设置过,默认是4

  •  
SHOW VARIABLES LIKE 'ft_min_word_len'

如果是4,则代表对4个字及其以上才建立索引,而中文有时候是两个字甚至1个字,所以建议设置为1,设置办法:
打开my.ini,在[mysqld]的最后一行添加:

  •  
ft_min_word_len=1

重启MySQL并重建索引:

  •  
REPAIR TABLE 表名 QUICK;

新建一个title_word字段,添加全文索引

title_word字段用于存储标题的分词。例如将《都挺好》第一集拆分成:都挺好 第一集两个词语,然后存储在title_word字段中。

将用户搜索的句子也分词

现在用户输入:都挺好第一集,首先将都挺好第一集拆分成:都挺好 第一集两个词语,然后在进行全文检索:

  •  
SELECT * FROM `articles` where MATCH(`title_word`) AGAINST ('都挺好 第一集')

 

这样就可以搜索到结果了。

如果是低于5.7版本的MySQL,也可以将汉字分词转为区位码或者base64encode后,就变成了英文和数字,也可以使用全文索引,参考:https://www.mdaima.com/jingyan/43.html

 

MySQL5.7分词全文检索思路_mysql