innodb 06 索引-全文检索 迈不过友情╰ 2023-01-05 12:12 136阅读 0赞 # 全文检索 # ### 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扩展查询。了解即可。
还没有评论,来说两句吧...