lucene tis和 tii 文件

本文详细介绍了Lucene中TIS(TermInfos)和TII(TermInfos Index)文件的作用和工作原理。TIS存储所有term信息,而TII作为TIS的索引,用于加速检索。通过TII定位term的大致位置,然后通过遍历或二分查找找到目标term。此外,TIS文件利用前缀压缩节省存储空间。文章还探讨了添加term信息、前缀压缩的实现以及term信息的读取过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在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 中进行检索

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值