MySQL 全文索引实现一个简单版搜索引擎( 二 )

使用默认方式创建全文索引1、该表已有关键词字段(对文章内容的简述) , 并以“,”作为分词符

MySQL 全文索引实现一个简单版搜索引擎

文章插图
 
2、不建全文索引时搜索某个关键词
需要进行全表扫描
MySQL 全文索引实现一个简单版搜索引擎

文章插图
 
3、对关键词字段创建全文索引(以 , 作为分词)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磁盘 , 添加全文索引也会失败
MySQL 全文索引实现一个简单版搜索引擎

文章插图
 
3.4 利用创建的全文索引进行查询某个关键词出现的次数
查询响应时间有了很大的提升 , 只需0.05s;使用where keywords like '%时尚%' 需要7.56s 。推荐阅读:MySQL性能优化实践(很全面 , 值得收藏)
MySQL 全文索引实现一个简单版搜索引擎

文章插图
 
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.ibd96K Jul 5 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_2.ibd96K Jul 5 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_3.ibd96K Jul 5 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_4.ibd128K Jul 5 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_5.ibd256K Jul 5 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_6.ibd96K Jul 5 16:29 FTS_00000000000000a7_BEING_DELETED_CACHE.ibd96K Jul 5 16:29 FTS_00000000000000a7_BEING_DELETED.ibd96K Jul 5 16:30 FTS_00000000000000a7_CONFIG.ibd96K Jul 5 16:29 FTS_00000000000000a7_DELETED_CACHE.ibd96K Jul 5 16:29 FTS_00000000000000a7_DELETED.ibd
  • 前6个表示倒排索引(辅助索引表)
  • 第7 , 8个表示包含已删除文档的文档ID(DOC_ID) , 其数据当前正在从全文索引中删除
  • 第9个表示FULLTEXT索引内部状态的信息
  • 第10 , 11个表示包含已删除但尚未从全文索引中删除其数据的文档
使用ngram分词解析器创建全文索引1、对title字段建立全文索引(该字段没有固定的stopwords 分词 , 使用ngram分词解析器)


推荐阅读