技术主题
在实际业务场景中,主要的核心数据库还是mysql,但是涉及到搜索的场景时候,这时候mysql的弊端就显示出来了,众所周知mysql的索引的底层结构是b+树,在词文搜索的时候不满足快速进行搜索匹配。为了弥补这一个缺点,业界内普遍使用Elasticsearch搜索引擎来实现,分词搜索,从而在上亿的数据中,快速检索出客户需要的内容。
技术原理
Elasticsearch的倒排索引
1)数据库的倒排索引,宏观上来讲就是对于一个键值对key-value,这一点和redis类似,es是通过value去寻找key,和正常的mysql逻辑不一样,mysql的B+索引是通过主键id去查询对应的value。
2)对于mysql的搜索关键词,普通的逻辑通过like查询,例如下面的语句:
select * from book where book_content like '%aa%';
可想而知存在的弊端就是无法使用数据库索引,需要全表扫描,性能差,搜索效果差,无法得到文档与搜索条件的相关性
3)es的整体交互数据图如下:
4)倒排索引结构:
整个倒排索引由两部分组成,一部分是单词词典,也就是分词后的词典,另一部分是倒排列表,倒排列表里面包含的是文档id、词频、位置等多个信息,数据之间本身是独立的,Lucene将倒排列表拆分成三个文件存储:doc后缀文件:记录 Postings 的 docId 信息和 Term 的词频;pay后缀文件:记录 Payload 信息和偏移量信息;pos后缀文件:记录位置信息
5)单词词典的内部有两种数据结构实现:B+树和hash表
倒排索引的另一部分是Term Dictionary :Terms Dictionary(索引表)存储所有的 Term 数据,同时它也是 Term 与 Postings 的关系纽带,存储了每个 Term 和其对应的 Postings 文件位置指针。
6)倒排索引的搜索过程如下,内部的搜索过程如下:
在整个搜索过程中,首先会将搜索的文本进行分词,查询用户的分词结果是否在单词词典中,如果不在搜索结束,没有搜到内容,如果分词存在于单词词典,
7)倒排索引的倒排列表存储如下:
例如下面的文档:
文档1:今年的年度目标
文档2:第二个年度的目标
DocID:出现某单词的文档ID
TF(Term Frequency):单词在该文档中出现的次数
POS:单词在文档中的位置
对于目标这个单词,目标在文档1出现的次数是1,单词的位置3