倒排索引是 Lucene 的核心数据结构,该系列文章将从源码层面(源码版本:Lucene-7.3.0)分析。该系列文章将以如下的思路展开。

  1. 什么是倒排索引?
  2. 如何定位 Lucene 中的倒排索引?
  3. 倒排索引是如何搜索的?
  4. 倒排索引是如何增删改的?

本文将介绍什么是倒排索引。

了解什么是倒排索引,其实是去了解为什么要有倒排索引。考虑这样一种场景,给你很多篇文档,现在要求找出包含指定单词的文档。第一种解决方案,遍历所有文档,自然能得到结果。第二种解决方案,遍历所有文档,得到结果后记录下来,下次再有这种请求时直接读取结果。如果把所有单词的结果都记录下来,之后的任何请求都能直接从结果中读取,这个结果的集合就叫做倒排索引。

以两个文档为例:

1.hello world!
2.hello china!

如何找出包含 china 的文档?一眼扫过去就知道是第 2 个文档(但在文档数量很多内容很大的情况下,可能需要很多眼)。

但如果将所有结果(即倒排索引)提前记录如下。

hello1,2
world1
china2

让你找出包含 china 的文档。不需要再去扫文档,根据倒排索引可知是第 2 个文档(在文档数量很多内容很大的情况下,能极大地提升效率)。

有些同学会问,两种解决方案都要去遍历文档,为什么采用第二种解决方案?因为后者只需要遍历一次,以后每次查询的时候直接查询倒排索引即可。

有些同学会问,如果采用第二种解决方案,当增删改文档的时候,倒排索引文件就不对了,那还是得重新遍历一次?不需要,将增删改文档转换为增删改倒排索引即可。

有些同学会问,增删改倒排索引的性能会不会很差?这个答案会在后面的文章中给出。而这也成为 Lucene 不断优化的目标之一。

05-11 20:44