今天遇到一个问题,就是明明做了全文索引,但是就是无法查询到
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全文索引之ft_min_word_len案例