在lucene 中使用 tis 保存了所有term的信息,为了加速检索,还保存了tii文件,他是tis文件的索引,下面图简单的表示了他们之间的关系
上图的左边表示tis中保存的所有的term ,右边tii是保存需要索引的term以及在tis中的位置,这样通过检索tii文件,定位到我们需要查找的term的大概位置,再通关过遍历(或者二分)找到term。 这样做好像比直接对所有的term建立索引会复杂了点,但是它有个好处,就是对tis中的term可以进行压缩(前缀压缩)
我们再引用一位高手的图,来说明整个结构
我们从代码的角度来看看,上面建立的过程
/lucene/src/org/apache/lucene/index/TermInfosWriter.java
添加一个term信息
这个过程对于tis 和 tii通用的,这里的index 变脸表示是 tis还是tii文件
1 如果是tis ,那么每隔n个需要往tii文件中索引一个term
2 调用writeTerm 写term词
3 写docFreq (term 出现的多少个doc ) , FreqPoint (出现doclist 的指针) ProxPoint(位置指针)
4 如果需要使用跳表,那么就写入跳表的下标
5 对于tii,需要写入term 在tis文件中的位置
下面,我们来看看writeTerm 实现
1 计算前缀
2 写入前缀长度、后缀长度、后缀内容,字段序号, 从这里可以看出,上面的那个图中的term信息遗漏了后缀内容
最后我们看看term信息的读取,其实就是一个相反的过程
/lucene/src/org/apache/lucene/index/SegmentTermEnum.java
用户检索的时候,就是一个查找过程,lucene 采用 二分 + 遍历的方法
/lucene/src/org/apache/lucene/index/TermInfosReader.java
其中getIndexOffset 就是采用二分法在tii 中进行检索