为什么需要 SearchEngine
为什么关系型数据库无法全文检索?慢关系型数据库通常以 B+ 树作为底层索引。一般我们在 MySQL 中模糊搜索这样用:
1select * from my_table where title like '%term%';
首先这个查询一定会触发全表扫描,即使 title 字段上建立了索引,like 语句中的 % 也会导致索引生效。
全表扫描有多慢?全表扫描本质上就是要把整张表的数据从磁盘中顺序读取出来,读取速度取决于存储介质的 I/O,因此耗时与数据量强相关,数据量越大,扫描时间越久。
相关性排序除了慢,传统数据库无法计算查询词与存储字段的相关性,数据库只保证查的出来,不保证查的相关性够强。
倒排索引
搜索引擎利用倒排索引解决上述问题。
倒排索引的本质上就是:term -> posting list 的映射。
如何构建倒排索引呢?分词 + 索引
分词搜索引擎中提供分词器 Analyzer,用于数据在写入倒排或者查询倒排时将内容切分成 term,成为倒排索引中的 key:term。
eg:有如下文本:小米手机, 为发烧而生,经过 Analyzer 处 ...
