MySQL全文索引之ft_min_word_len案例

今天遇到一个问题,就是明明做了全文索引,但是就是无法查询到

mysql> SELECT id,title,keywords,litpic FROM `health_archives` WHERE litpic<>'' and MATCH (title) AGAINST ('高血压' WITH QUERY EXPANSION) order by id desc limit 0,5;
Empty set (0.00 sec)

这个问题有很多种原因,其中最常见的就是ft_min_word_len(最小搜索长度)导致的。 查看一下全文索引相关的参数设置

mysql> select version();
+------------+
| version() |
+------------+
| 5.1.69-log |
+------------+
1 row in set (0.00 sec)

mysql> show global variables like "%ft%";
+--------------------------+----------------+
| Variable_name | Value |
+--------------------------+----------------+
| ft_boolean_syntax | + -><()~*:""&| |
| ft_max_word_len | 84 |
| ft_min_word_len | 4 |
| ft_query_expansion_limit | 20 |
| ft_stopword_file | (built-in) |
+--------------------------+----------------+
5 rows in set (0.00 sec)

PS.相关参数的说明

ft_boolean_syntax:全文索引分词关键字,不能更改,为内置变量
ft_max_word_len:最大分词长度,一般情况下不需要更改
ft_min_word_len:最小分词长度,一般修改为1
ft_query_expansion_limit:不明觉厉的一个参数,基本上不需要设置 ft_stopword_file:全文停止词

发现ft_min_word_len为4,默认是该值。也就是说,mysql fulltext只会对4个字或者4个字以上的关键字进行建立索引操作。而刚刚搜索的”高血压”关键字长度都小于4。

全文索引相关的参数都无法进行动态修改,我们需要在/etc/my.cnf添加参数ft_min_word_len=1,并且重启mysql服务器,重启完毕之后,对应表执行repair操作。理论上,涉及到ft_相关参数修改的,都需要重启服务器,并且修复所有含有fulltext索引的表。 vim /etc/my.cnf 添加一行: ft_min_word_len=1 重启MySQL 修复mysql_fulltext后,执行查询语句 REPAIR TABLE mysql_fulltext QUICK;

mysql> SELECT id,tile,keywors,ltpic FROM `health_archivs` WHERE litpic<>'' and MATCH (title) AGAINST ('高血压' WITH QUERY EXPANSION) order by id desc limit 0,5;
+--------+---------------------------------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------+
| id | title | keywords | litpic |
+--------+---------------------------------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------+
| 660573 | 高血压吃什么 推荐八种适宜食物 | 高血压吃什么,高血压吃哪些食物,高血压食物有哪些 | /uploads/161103/404_152707_1_lit.jpg |
| 656698 | 秋季警惕高血压发病 高血压的症状 | 哪些症状是表示高血压,高血压发病后有什么表现,高血压的症状有哪些 | /upload/161013/408_161302_1_lit.jpg |
| 653871 | 男性困得早警惕高血压 高血压的症状 | 高血压的症状有哪些,高血压的症状是什么,哪些是高血压症状 | /upload/160927/408_134848_1_lit.jpg |
| 632209 | 20%患阻碍性呼吸睡眠暂停 八招让你一觉到天亮 | 如何拥有好睡眠,怎么拥有好睡眠,拥有好睡眠 | /upload/160527/404_095535_1_lit.jpg |
| 626184 | 高血压吃什么 橘子鲜梅效果好 | 高血压怎么办,高血压吃什么,高血压有什么禁忌 | /upload/160425/346_100710_1_lit.jpg |
+--------+---------------------------------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------+
5 rows in set (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE '%ft_%';
+--------------------------+----------------+
| Variable_name | Value |
+--------------------------+----------------+
| ft_boolean_syntax | + -><()~*:""&| |
| ft_max_word_len | 84 |
| ft_min_word_len | 1 |
| ft_query_expansion_limit | 20 |
| ft_stopword_file | (built-in) |
+--------------------------+----------------+
5 rows in set (0.00 sec)

以上查询,就能查到相对应的数据了。

PS.如果还是不行,可以重建索引文件。我就是这样的情况。

参考:http://imysqldba.blog.51cto.com/1222376/1618487

此条目发表在MySql分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

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