我们都知道关于全文检索大多公司的选型都是ElasticSearch,为什么是它?可能有的人会回复Es利用倒排索引适用于全文检索,倒排索引怎么存的?倒排索引为什么这么优秀?为什么不是MySql和Redis等(这里只拿代表的关系型数据库MySql和内存型数据库Redis举例子?
我们先说为什么不选择MySql和Redis来讲,为什么不选择MySql?我们先从MySql的索引存储结构来讲,大家都知道MySql的索引存储结构是B Tree,如果执行下面全文检索的SQL会走索引吗?
SELECT * FROM company WHERE title LIKE "%工控猫%";
答案肯定是不能走。不走索引,数据量大的时候就会有磁盘IO的瓶颈。
放到内存里面啊,内存里面很快啊,为什么不用Redis做?当然如果你们公司足够有钱可以考虑,1PB的数据要用内存存储,需要多少节点,大兄弟,内存那么贵,没有闻到钱在燃烧的味道吗!?
为什么全文索引选择ElasticSearch?可能大家讲Es更新数据的时候是准实时,空间换时间了,这样讲也没错,主要有下面四点:
- 倒排索引
- 索引与数据分离
- 索引数据存储内存
- 压缩数据
倒排索引是怎么构成的?是有Term Index,Term Dictionary和Posting List三部分构成的,Term-Index存储在内存中,Term Dictionary和Posting List存储在硬盘。
Term Dictionary的基础上添加了Term Index来加速检索,term index 以树的形式缓存在内存中。从成本和效率来讲ES是一个优秀的解决方案。