**全文索引(full-text)
ngram全文解析器
ngram就是一段文字里边连续的n个字的序列,ngram全文解析器能够对文本进行分词,每个单词是连续的序列,例如:用ngram全文解析器对“生日快乐”进行分词
n=1: ‘生’, ‘日’, ‘快’, ‘乐’
n=2: ‘生日’, ‘日快’, ‘快乐’
n=3: ‘生日快’, ‘日快乐’
n=4: ‘生日快乐’
添加全文索引
alter table customers1 add fulltext index testfulltext(name) with parser ngram;
查看索引
添加完索引后后产生几个文件
FTS_0000000000000031_000000000000005c_INDEX_1~6.ibd这6个文件用于存储倒排索引,存储的是分词和位置以及document ID,根据分词的第一个字符值进行分区,映射到不同的文件中; 文件的命名规则为FTS_{TABLE_ID} {INDEXID}INDEX{N}.ibd
FTS_0000000000000031_BEING_DELETED.ibd包含已经被删除的DOC_ID,但还没从全文索引数据中删掉; FTS_0000000000000031_DELETED_CACHE.ibd 是前者的内存缓存(但是搜索了下代码,只有当fts_cache_t::deleted_doc_ids被使用时,才会在sync时转储到该表中,但并没有发现任何地方使用这个对象)
FTS_0000000000000031_BEING_DELETED_CACHE.ibd 和 FTS_0000000000000031_BEING_DELETED.ibd,包含了已经被删除索引记录并且正在从全文索引中移除的DOC ID,前者是后者的内存版本,这两个表主要用于辅助进行OPTIMIZE TABLE时将DELETED/DELETED_CACHED表中的记录转储到其中。
FTS_0000000000000031_CONFIG.ibd,包含全文索引的内部信息,最重要的存储是FTS_SYNCED_DOC_ID,表示已经解析并刷到磁盘的doc id, 在崩溃恢复时,可以根据这个值判断哪些该重新解析并加入到索引cache中。
查询操作
1、按自然语言搜索模式查询
SELECT * FROM customers1 WHERE MATCH (name) AGAINST (‘实来’ IN NATURAL LANGUAGE MODE) limit 0, 3;
2、按布尔全文搜索模式查询
SELECT * FROM customers1 WHERE MATCH (name) AGAINST (’+实来’ IN BOOLEAN MODE) limit 0, 3;
匹配既有没有实来的数据
mysql> SELECT * FROM customers WHERE MATCH (name) AGAINST (’-实来’ IN BOOLEAN MODE) limit 0, 3;
Empty set (0.00 sec)
匹配相关的数据
mysql> SELECT * FROM customers WHERE MATCH (name) AGAINST (’>实来’ IN BOOLEAN MODE) limit 0, 3;