关注「Java视界」公众号,获取更多技术干货

为啥ElasticSearch搜索那么快?倒排索引又是啥?

 在搜索引擎中包含很多的文件,每个文件都有对应的ID,文件内容就是系列关键词的集合(每个关键词也有对应ID)。

例如“文档1”经过分词,提取了100个关键词,会记录每个关键词在文档中的出现次数和出现位置。

一、倒排索引

假如给你一个文本库,现在让你去找出所有包含“Hello”这个单词的文档,并按该单词出现的频率高低进行权重,即出现次数最多的文本优先展示。

1.1 正排索引

倒排索引是相对于正排索引来说的,对于上面的场景,先看正排索引会怎么做:

如果是正排索引,结构如下:

可以看到正排索引是以文档为第一层,也就是说如果要搜索包含关键词1的文档,那么所有文档都需要扫描,记录哪些文档包含了关键词1,最后返回结果。

1.2 倒排索引

上面介绍了正派索引,可以看到在根据某个关键词进行搜索时需要扫描所有文档,这个效率就太低了,要是文档少还好,要是海量文档,肯定影响用户体验。

于是就出现了倒排索引来解决上面的问题,倒排索引结构如下:

可以看出区别了吧,与正排索引不同,倒排索引是关键词为第一层。创建倒排索引首先要将每个文档拆分成独立的词,然后创建一个包含所有不重复词条的集合,最后列出每个词条在哪个文档出现过。

举个例子:

 

若我们搜索hello ok,就可以得到下面的结果:

可以看到doc1比doc2的匹配度高,优先返回。

倒排索引的好处是啥?那就是当你搜索某个关键词的时候,就直接返回包含了该关键词的文档了。效率大大提高,快得不是一星半点。ES底层的lucene利用的就是这种倒排索引方式来做到快速的搜索。

总结来说,正排索引和倒排索引的区别就体现在包含关系上,正排索引是去记录某个文档包含哪些关键字,倒排索引就是记录某个关键字在哪些文档里出现过。

posted @ 2022-06-25 14:02  沙滩de流沙  阅读(323)  评论(0编辑  收藏  举报

关注「Java视界」公众号,获取更多技术干货