MySQL5.7分词全文检索思路

通常我们在进行模糊查询时,都是通过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

参考文章:https://www.cnblogs.com/ibook360/p/5073313.html

多关键词模糊搜索

简易的实现多关键词模糊搜索,搜索结果按照匹配关键词的多寡来排序
举例如下:

SELECT *,
(
    (IF( CONCAT_WS(" ", title, subtitle, tag) LIKE "%车%", 1, 0))
    + (IF( CONCAT_WS(" ", title, subtitle, tag) LIKE "%摩托%", 1, 0))
    + (IF( CONCAT_WS(" ", title, subtitle, tag) LIKE "%红色%", 1, 0))
    + (IF( CONCAT_WS(" ", title, subtitle, tag) LIKE "%美国%", 1, 0))
    + (IF( CONCAT_WS(" ", title, subtitle, tag) LIKE "%2006%", 1, 0))
) AS keyweight
FROM article WHERE 
CONCAT_WS(" ", title, subtitle, tag) REGEXP "车|摩托|红色|美国|2006"
ORDER BY keyweight DESC

转自:http://lao.si/120

发表评论

邮箱地址不会被公开。 必填项已用*标注