实战2000W条数据实现全文检索

一) 前期准备测试:

  • 旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。

  • 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息要随时关注官网,下载mySql5.7

  • 直接使用,可检索数字,英文,测时检索中文失败

      alter table testtable add fulltext index testfulltext(clumn1,clumn2)`
    
  • 解决无法查询中文,修改配置文件my.ini [mysqld] ngramtokensize=2

加入全文索引

  1. 建表同时加入全文检索

     CREATE TABLE articles ( id INTUNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT,FULLTEXT (title,body) WITH PARSER ngram ) ENGINE=InnoDB CHARACTER SET utf8mb4;
    
  2. 修改方式添加全文检索

     alter table testtable add fulltext index testfulltext(clumn1,clumn2) with parser ngram;
    
  3. 新建方式添加全文检索

     CREATE FULLTEXT INDEX ft_email_name ON student(name) with parser ngram;`
    
  4. 验证全文检索结果

     SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('关键词' IN NATURAL LANGUAGE MODE);
    

    注意:关键字不能太短,小于两个字无法匹配> 注意:关键字不能太短,小于两个字无法匹配

二) 2000W数据实测:

数据库已经建好,数据已经插入,总数据量为1980W条数据

  1. 添加全文检索:

     CREATE FULLTEXT INDEX ft_pat_search ON pat_patent(`aa`,`ad`,`agc`,`an`,`pn`,`in`,`pa`,`ti`,`co`) with parser ngram;
    
  2. 查询:

     SELECT * FROM pat_patent WHERE MATCH (`aa`,`ad`,`agc`,`an`,`pn`,`in`,`pa`,`ti`,`co`) AGAINST ('三星' IN NATURAL LANGUAGE MODE);
    

    结果用时183s,耗时太长 分析原因1:索引量过大导致过慢,尝试缩短检索字段(只选用一个字段)

     CREATE FULLTEXT INDEX ft_pat_search_ti ON pat_patent(`ti`) with parser ngram;
    

    结果可明显提升检索速率,检索用时1.3s; 依旧不理想,继续分析原因,可能是查询结果数据量过大,传输受限,尝试加入分页

     SELECT * FROM pat_patent WHERE MATCH (`aa`,`ad`,`agc`,`an`,`pn`,`in`,`pa`,`ti`,`co`) AGAINST ('三星' IN NATURAL LANGUAGE MODE) LIMIT 10, 10;
    

    查询结果0.5s,测试成功

三)总结:

  • 版本更新至5.7,注意数据库路径选择在非C盘,负责会在添加全文检索时报错ERRO:1878
  • 添加检索式加上 with parser ngram
  • 配置文件加上ngramtokensize=2,可解决搜索中文问题
  • 提高查询效率,可加入分页

猜你喜欢

转载自blog.csdn.net/u011374582/article/details/82772009