全文检索

1、倒排索引

两种倒排索引。
inverted file index,其表现形式为{单词,单词所在文档的ID}
full inverted index,其表现形式为{单词,(单词所在文档的ID,在具体文档中的位置)}
普通全文检索表:{文档ID,text}
倒排文件索引关联数组:inverted file index{number,单词,单词所在文档的ID}
详细倒排索引关联数组:{number,单词,(单词所在文档的ID,在具体文档中的位置)}

innodb全文检索使用的是full inverted index。

2、innodb全文检索-底层结构。

innodb全文检索表:{word,ilist}。并且word字段是索引,
PS:ilist = (DocumentId,Position)
由于在ilist有位置信息,所以支持邻近搜索。

innodb辅助表(详细倒排索引表):word存放的表。innodb为提升并行性,一共设置了六张辅助表。个人理解:分词存放的表

FTS(FTS Index Cache,全文检索索引缓存,缓存详细倒排索引),其用来提高全文检索的性能。
FTS是一个红黑树结构,根据(word, list)排序。
插入:索引先更新到缓存中,而后InnoDB存储引擎会批量进行更新到辅助表中。
FTS Document innodb全文检索表:为了支持全文检索,必须有一个列与word进行映射,在InnoDB中这个列被命名为FTS_DOC_ID,其类型必须是BIGINT UNSIGNED NOT NULL,并且InnoDB存储引擎自动会在该列上加入一个名为FTS_DOC_ID_INDEX的Unique Index。
缓存更新:事务提交时将分词写入到FTS Index Cache
磁盘更新:当对全文检索进行查询时,Auxiliary Table首先会将在FTS Index Cache中对应的word字段合并到Auxiliary Table中,然后再进行查询
数据库关闭:在FTS中的数据库会同步到磁盘上的Auxiliary Table中。
数据库宕机:FTS尚未同步到磁盘。下次重启的之后,用户进行全文检索时,innodb会自动读取未完成的文档,进行分词操作,然后把分词结果放在FTS缓存中。
删除过程:删除FTS缓冲,将Auxiliary Table表中对应的额FTS_DOC_ID保存在delete Auxiliary Table中。
彻底删除:命令就是OPTIMIZE TABLE。(OPTIMIZE TABLE可能会耗时很长,可以设定其删除的数量。)
缓存大小:innodb_ft_cache_size用来控制FTS Index Cache的大小,默认值为32M。

3、语法

分词
innodb会把单词拆分进行存储,查找时,根据单词匹配。
相关性
如果一个查询,匹配到多条记录,是怎么返回呢?根据相关性、
word(查询关键字)是否在文档中出现、word在文档中出现的次、数word在索引列中的数量、多少个文档包含该word

模式:

a:表示查询带有指定word的文档–默认的检索模式

SELECT * FROM test WHERE MATCH(title) AGAINST('what' in NATURAL LANGUAGE MODE);
    SELECT * FROM test WHERE MATCH(title) AGAINST('what');

B: Boolean当使用这种模式时,表示字符串前后的字符有特殊含义。比如要查找有Pease单词的记录

SELECT * FROM test WHERE MATCH(title) AGAINST('+Pease' in BOOLEAN MODE);
假设,我们需要查找有Pease,但是没有hot的记录呢?用+,-符号,分别表示一定存在,或者一定不存在
 SELECT * FROM test WHERE MATCH(title) AGAINST('+Pease -hot' in BOOLEAN MODE);

C: Query Expansion扩展查询。了解即可。