mysql全文索引____ft_min_word_len

对于刚使用mysql全文索引搜索的童鞋,第一个疑惑可能就是,为什么我搜索xx结果不显示呢?明明我数据里面有。这个问题有很多种原因,其中最常见的就是ft_min_word_len(最小搜索长度)导致的。

准备测试数据如下

CREATE TABLE mysql_fulltext
(id BIGINT UNSIGNED AUTO_INCREMENT,
text_info VARCHAR(1000) NOT NULL,
PRIMARY KEY(id),
FULLTEXT(text_info)
)ENGINE=MYISAM DEFAULT CHARSET utf8 COMMENT ‘mysql全文索引测试表‘;

INSERT INTO `mysql_fulltext`(text_info)  VALUES (‘a‘),(‘b‘),(‘c‘),(‘aa‘),(‘bb‘),(‘cc‘),(‘aaa‘),(‘bbb‘),(‘ccc‘),(‘aaaa‘),(‘bbbb‘),(‘cccc‘);

使用如下语句进行搜索

SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST(‘a‘);
SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST(‘aa‘);
SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST(‘aaa‘);

按照我们的惯性思维,应该会显示四条数据才对;但结果却是一条数据都没有。

但是我们执行

SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST(‘aaaa‘);

却有结果如下:

我们看一下全文索引相关的参数设置。

SHOW GLOBAL VARIABLES LIKE ‘%ft_%‘;

5.6之前myisam的全文索引,需要调节的参数相对来说比较少,只有以上五个。

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个字以上的关键字进行建立索引操作。而刚刚搜索的‘a‘,‘aa‘,‘aaa‘关键字长度都小于4。

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

使用如下sql语句寻找含有fulltext索引的表

SELECT DISTINCT CONCAT(‘repair table ‘,table_schema,‘.‘,table_name,‘ quick;‘) FROM information_schema.`STATISTICS` WHERE index_type=‘fulltext‘

我们修复mysql_fulltext后,执行查询语句

REPAIR TABLE mysql_fulltext QUICK;
SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST(‘a‘);

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

但是疑问来了,为什么我查询关键字‘a‘,却无法搜索出‘aa‘,‘aaa‘,‘aaaa‘关键字对应的行呢?

有兴趣的童鞋可以自行思考一下,或者关注我后续的mysql全文索引相关文章。

时间: 2024-08-24 06:41:28

mysql全文索引____ft_min_word_len的相关文章

mysql全文索引

一.如何设置? 如图点击结尾处的{全文搜索}即可设置全文索引,不同MYSQL版本名字可能不同. 二.设置条件1.表的存储引擎是MyISAM,默认存储引擎InnoDB不支持全文索引(新版本MYSQL5.6的InnoDB支持全文索引)2.字段类型:char.varchar和text 三.配置my.ini配置文件中添加# MySQL全文索引查询关键词最小长度限制[mysqld]ft_min_word_len = 1保存后重启MYSQL,执行SQL语句 复制代码 代码如下: SHOW VARIABLES

MySQL全文索引应用简明教程

本文从以下几个方面介绍下MySQL全文索引的基础知识: MySQL全文索引的几个注意事项 全文索引的语法 几种搜索类型的简介 几种搜索类型的实例 全文索引的几个注意事项 搜索必须在类型为fulltext的索引列上,match中指定的列必须在fulltext中指定过 仅能应用在表引擎为MyIsam类型的表中(MySQL 5.6以后也可以用在Innodb表引擎中了) 仅能再char.varchar.text类型的列上面创建全文索引 像普通索引一样,可以在定义表时指定,也可以在创建表后添加或者修改 对

mysql全文索引之模糊查询

旧版的MySQL的全文索引只能用在MyISAM表格的char.varchar和text的字段上. 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息大家可以随时关注官网,下面我来谈谈mysql全文索引的用法,网上很多啦,我只讲讲我所了解滴部分哈:我的mysql版本是: 新建一张表test: CREATE TABLE `test` ( `name` char(12) NOT NULL DEFAULT '', `nickname` char(12) NOT NULL D

mysql全文索引____内置分词变量

上一节,我们发现搜索'a',但是发现'aa','aaa','aaaa'搜索不出来.为什么呢? 这就涉及到mysql的一个内置变量ft_boolean_syntax. ft_boolean_syntax Variable_name    Value ft_boolean_syntax    + -><()~*:""&|(其中有一个空格) 该变量的意思,表示需要被全文索引的字段通过以上这些变量进行分词切分. 譬如有一段字符串"a,b,c,ab",如果

关于MySql全文索引

从 Mysql 4.0 开始就支持全文索引功能,但是 Mysql 默认的最小索引长度是 4.如果是英文默认值是比较合理的,但是中文绝大部分词都是2个字符,这就导致小于4个字的词都不能被索引,全文索引功能就形同虚设了.国内的空间商大部 分可能并没有注意到这个问题,没有修改 Mysql 的默认设置. 为什么要用全文索引呢? 一般的数据库搜索都是用的SQL的 like 语句,like 语句是不能利用索引的,每次查询都是从第一条遍历至最后一条,查询效率极其低下.一般数据超过10万或者在线人数过多,lik

mysql全文索引____简介

生产环境中,用到mysql全文索引的童鞋应当是少数.但是我现在所在的工作中,非常广泛的用到mysql全文索引,统一做下笔记.也可以方便有需要的童鞋. 全文索引,英文叫做fulltext index,法文叫做L'index de texte intégral.使用环境,当需要在大量文本中搜索某些内容的时候:譬如文章搜索,百度搜索,淘宝搜索... 我现在所在环境用的最多的是网站商品信息搜索. mysql全文索引几点信息 mysql5.6之前,只有myisam支持全文索引.到了mysql5.6,inn

基于mysql全文索引的深入理解

前言:本文简单讲述全文索引的应用实例,MYSQL演示版本5.5.24.Q:全文索引适用于什么场合?A:全文索引是目前实现大数据搜索的关键技术.至于更详细的介绍请自行百度,本文不再阐述.--------------------------------------------------------------------------------一.如何设置? 如图点击结尾处的{全文搜索}即可设置全文索引,不同MYSQL版本名字可能不同. 二.设置条件1.表的存储引擎是MyISAM,默认存储引擎In

MySQL全文索引 FULLTEXT索引和like的区别

1.概要 InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,之前只有MyISAM引擎支持FULLTEXT索引.对于FULLTEXT索引的内容可以使用MATCH()-AGAINST语法进行查询. 为了在InnoDB驱动的表中使用FULLTEXT索引MySQL5.6引入了一些新的配置选项和INFORMATION_SCHEMA表.比如,为了监视一个FULLTEXT索引中文本处理过程的某一方面可以查询INNODB_FT_CONFIG,INNODB_FT_INDEX_TABLE,

MySQL全文索引、联合索引、like查询、json查询速度大比拼

查询背景 有一个表tmp_test_course大概有10万条记录,然后有个json字段叫outline,存了一对多关系(保存了多个编码,例如jy1577683381775) 我们需要在这10万条数据中检索特定类型的数据,目标总数据量:2931条 SELECT COUNT(*) FROM tmp_test_course WHERE `type`=5 AND del=2 AND is_leaf=1 我们在限定为上面类型的同时,还得包含下面任意一个编码(也就是OR查询) jy157768338177