全文检索lucence之倒排索引

天涯浪子 提交于 2020-01-09 23:50:09

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

        索引可以类比一本书的目录,通过目录我们可以快速定位到想要找的内容。同样,在数据库中存储了海量的数据,通过创建索引,我们可以较快速的查询到指定的内容。

        通常情况下,比如传统的关系型数据库(RDBMS),常见的有mysql、Oracle,此类数据库中,我们创建的索引一般为正排索引,即存储(key,value)的数据时,通过对key创建索引,来寻找value。

        与上面的方式不同,lucence则是通过value来查找key的方式来创建索引。

        lucence是基于java进行开发的。其将资源以Document 为对象进行存储,每个文档由一些列Field构成。对field创建索引,关联文档的唯一id。通常情况下,当储存一个新的文档时,会对文档数据分词,即获取Fields,接着创建倒排索引,其存储结构为:词项的字符串+词项的文档频率+记录词项的频率信息+记录词项的位置信息+跳跃偏移量。简单的理解可以形成以下结构:

分别表示词,词出现的文档编号,文档中出现的频率和文档中出现的位置。这样当我们对词进行搜索时,会找到该词出现过的所有文档的ID,然后再通过该文档的ID寻找文档的具体内容。

当然,Lucene词典中词的顺序是按照英文字母的顺序排列的,这样就可以采用压缩存储:假设有term,termagancy,termagant,termina四个词。每个字母需要1byte的空间,常规存储一共需要35byte。而压缩存储之后为:"term4agancy8t4inal",一共需要22byte,节省大量的空间。
 

 

参考资料:https://blog.csdn.net/chunlei_zhang/article/details/38520315

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!