个人随笔
目录
MySQL添加全文索引(一)
2019-05-28 23:39:22

1、ngram and MeCab full-text parser plugins

全文检索在MySQL里面很早就支持了,只不过一直以来只支持英文。缘由是他从来都使用空格来作为分词的分隔符,而对于中文来讲,显然用空格就不合适,需要针对中文语义进行分词。但从MySQL 5.7开始,MySQL内置了ngram全文检索插件,用来支持中文分词,并且对MyISAM和InnoDB引擎有效。

2、必要的参数设置

在使用中文检索分词插件ngram之前,先得在MySQL配置文件里面设置他的分词大小(默认是2)

  1. [mysqld]
  2. ngram_token_size=2
  3. ft_min_word_len=3

分词的SIZE越小,索引的体积就越大,所以要根据自身情况来设置合适的大小。MySQL 中使用全局变量ngram_token_size来配置ngram中n的大小,它的取值范围是1到10,默认值是2。通常ngram_token_size设置为要查询的单词的最小字数。如果需要搜索单字,就要把ngram_token_size设置为1。在默认值是2的情况下,搜索单字是得不到任何结果的。因为中文单词最少是两个汉字,推荐使用默认值2。我为了搜索单字这里设置为1,然后单词长度为3就建立索引。

3、添加全文索引

alter table tcontent add fulltext index tcontentfulltext(content) with parser ngram;
当然也可以在建表时

CREATE TABLE table (
id INTUNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body) WITH PARSER ngram
) ENGINE=InnoDB CHARACTER SET utf8mb4;

4、查询索引

4.1、按自然语言搜索模式查询

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

4.2、按布尔全文搜索模式查询

SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘关键词’ IN BOOLEAN MODE);

4.3、匹配既有管理又有数据库的记录

SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘+数据库 +管理’ IN BOOLEAN MODE);

4.4、匹配有数据库,但是没有管理的记录

SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘+数据库 -管理’ IN BOOLEAN MODE);

4.5、匹配MySQL,但是把数据库的相关性降低

SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘>数据库 +MySQL’ INBOOLEAN MODE);

5、建立全文索引后产生的文件

建立全文索引后,会产生如下文件

5.1、FTS_0000000000000038_0000000000000043_INDEX_1~6.ibd

这6个文件用于存储倒排索引,存储的是分词和位置以及document ID,根据分词的第一个字符值进行分区,映射到不同的文件中;文件的命名规则为FTS_{TABLE_ID}{INDEX_ID}_INDEX{N}.ibd。

5.2、FTS_0000000000000038_DELETED.ibd和FTS_0000000000000038_DELETED_CACHE.ibd

包含已经被删除的DOC_ID,但还没从全文索引数据中删掉。后者是前者的缓存。

5.4、FTS_0000000000000038_BEING_DELETED.ibd和FTS_0000000000000038_BEING_DELETED_CACHE.ibd

包含了已经被删除索引记录并且正在从全文索引中移除的DOC ID,后者是前者的缓存,这两个表主要用于辅助进行OPTIMIZE TABLE时将DELETED/DELETED_CACHED表中的记录转储到其中。

5.5、FTS_0000000000000038_CONFIG.ibd

包含全文索引的内部信息,最重要的存储是FTS_SYNCED_DOC_ID,表示已经解析并刷到磁盘的doc id, 在崩溃恢复时,可以根据这个值判断哪些该重新解析并加入到索引cache中。

6、删除全文索引

  1. alter table tcontent drop index tcontentfulltext ;

在修改了ngram_token_size分词的大小后要重新建立索引。

总结

没啥好总结的,以后要遇到更多问题呢。

  1. alter table tcontent add fulltext index tcontentfulltext(content) with parser ngram;
  2. alter table tcontent drop index tcontentfulltext ;
  3. select * from tcontent where MATCH(content) AGAINST('java');
  4. select * from tcontent where MATCH(content) AGAINST('java' IN BOOLEAN MODE);
  5. SELECT * FROM tcontent where content like '%java%';

原文:https://blog.csdn.net/maquealone/article/details/81085638

 413

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2