my.cnf配置文件中设置innodb_ft_min_token_size,并重启MySQL服务(最小两个字符作为一个关键词,默认三个字符作为一个关键词)
[mysqld] innodb_ft_min_token_size=23.1 设置自定义stopwords(即分词)
USE mysql; CREATE TABLE my_stopwords(VALUE VARCHAR(30)) ENGINE = INNODB; INSERT INTO my_stopwords(VALUE) VALUE (','); SET GLOBAL innodb_ft_server_stopword_table = 'mysql/my_stopwords'; SHOW GLOBAL VARIABLES WHERE Variable_name IN('innodb_ft_min_token_size','innodb_ft_server_stopword_table'); +---------------------------------+--------------------+ | Variable_name | Value | +---------------------------------+--------------------+ | innodb_ft_min_token_size | 2 | | innodb_ft_server_stopword_table | mysql/my_stopwords | +---------------------------------+--------------------+3.2 创建全文索引
alter table article add fulltext index idx_full_keyword(keywords); * [ ] Query OK, 0 rows affected, 1 warning (1 min 27.92 sec) * [ ] Records: 0 Duplicates: 0 Warnings: 13.3 剩余磁盘空间需足够,原表4.6G,剩余5.7G磁盘,添加全文索引也会失败
df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 7.8G 6.3G 1.2G 85% / tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/mapper/vg_opt-lvol0 19G 12G 5.7G 68% /datas 会创建原表大小的临时文件 8.6K Jul 5 16:19 #sql-5250_3533.frm 4.4G Jul 5 16:20 #sql-ib117-1768830977.ibd alter table article add fulltext index idx_full_keyword(keywords); ERROR 1114 (HY000): The table 'article' is full3.4 利用创建的全文索引进行查询某个关键词出现的次数
查询响应时间有了很大的提升,只需0.05s;使用where keywords like '%时尚%' 需要7.56s
3.5 如需同时完全匹配多个关键词,用布尔全文搜索
表示完全匹配 "三里屯,北京" 的记录数 select count(*) from article where match(keywords) against('+三里屯,北京' in boolean mode); +----------+ | count(*) | +----------+ | 1 | +----------+ 1 row in set (0.06 sec) 表示匹配“三里屯” 或者 “北京”的记录数 select count(*) from article where match(keywords) against('三里屯,北京'); +----------+ | count(*) | +----------+ | 8 | +----------+ 1 row in set (0.06 sec)3.6 创建全文索引后,会创建一些其它文件
96K Jul 5 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_1.ibd
96K Jul 5 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_2.ibd
96K Jul 5 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_3.ibd
96K Jul 5 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_4.ibd
128K Jul 5 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_5.ibd
256K Jul 5 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_6.ibd
96K Jul 5 16:29 FTS_00000000000000a7_BEING_DELETED_CACHE.ibd
96K Jul 5 16:29 FTS_00000000000000a7_BEING_DELETED.ibd
96K Jul 5 16:30 FTS_00000000000000a7_CONFIG.ibd
96K Jul 5 16:29 FTS_00000000000000a7_DELETED_CACHE.ibd
96K Jul 5 16:29 FTS_00000000000000a7_DELETED.ibd
- 前6个表示倒排索引(辅助索引表)
- 第7,8个表示包含已删除文档的文档ID(DOC_ID),其数据当前正在从全文索引中删除
- 第9个表示FULLTEXT索引内部状态的信息
- 第10,11个表示包含已删除但尚未从全文索引中删除其数据的文档
1、对title字段建立全文索引(该字段没有固定的stopwords 分词,使用ngram分词解析器)
需先在my.cnf 配置文件中设置ngram_token_size(默认为2,2个字符作为ngram 的关键词),并重启mysql服务
这里使用默认的 2
2、对title字段创建全文索引
alter table article add fulltext index ft_index_title(title) with parser ngram; Query OK, 0 rows affected (3 min 29.22 sec) Records: 0 Duplicates: 0 Warnings: 0