首先下面这篇文章是我看别人写的博客自己总结的,想让自己了解的更透,若想看原文,请看下面链接文章
https://www.cnblogs.com/guochunguang/articles/3641008.html
正文开始:
首先,我出发点是想了解 elsticsearch原理,然而elasticsearch是基于luence来进行开发的分布式搜索引擎,在看luence原理的时候,我感觉最需要理解的地方 就是 倒排索引
于是,我们先里了解一下索引
索引就是通过事先排好序,从而在查找时可以应用二分查找等高效率的算法。
一般的顺序查找,复杂度为O(n),而二分查找复杂度为O(log2n)。当n很大时,二者的效率相差及其悬殊。
不管数据表有无索引,首先在SGA的数据缓冲区中查找所需要的数据,如果数据缓冲区中没有需要的数据时,服务器进程才去读磁盘。
1、无索引,直接去读表数据存放的磁盘块,读到数据缓冲区中再查找需要的数据。
2、有索引,先读入索引表,通过索引表直接找到所需数据的物理地址,并把数据读入数据缓冲区中。
而全文检索中建立的索引称之为倒排索引
倒排索引源于实际应用中需要根据属性的值来查找记录,lucene是基于倒排索引实现的。
倒排索引:由单词词典和倒排文件形成
倒排:以前:所存储的信息是每个文件包含哪些字符串,我们要获取我们需要的字符串,就是从文件---------->字符串映射
现在:字符串到文件的映射是文件 字符串---------------->文件 字符串到文件的映射是文件到字符串映射的反向过程
倒排文件包含
频率文件和位置文件 ① 频率文件主要是说关键词在文章中出现的次数,②位置文件主要是说关键词在文章中出现的位置
单词词典
包含关键词,同时保存对应的另外两个文件的指针
如下例子:
设有两篇文章1和2:
文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too.
文章2的内容为:He once lived in Shanghai.
形成最后的索引结构为:
关键词 文章号
guangzhou 1
he 2
i 1
live 1,2
shanghai 2
tom 1
关键词 文章号[出现频率] 出现位置
guangzhou 1[2] 3,6
he 2[1] 1
i 1[1] 4
live 1[2] 2,5
2[1] 2
shanghai 2[1] 3
tom 1[1] 1
形成单词词典--倒排文件
guangzhou ->1
he->2
i->1
live ->1->2
shanghai->2
tom ->1
倒排文件实则是一个文档链表,称之为倒排表
所以我们在通过关键词 拿出文件时会将包含这些关键词的文件 进行连接 (并集)