lucene为了能够是信息存储的空间更小,访问速度更快,用了一些小技巧,下面介绍一些技巧:
1. Prefix + Suffix
在保存Term Dictionary的时候,会保存几乎所有的词,这样索引文件会非常大,当某个词跟前面一个词拥有相同前缀的时候,后面的词仅仅保存前缀在词中得偏移,以及除了前缀之外的字符串。
比如存储如下几个词: term, termagancy, termagant, terminal .
按照正常的方法来存储,需要 4 + 10 + 9 + 8 = 29.
如果使用这个技巧, termagancy 被存储成 [4][a][g][a][n][c][y] 这样算下来一共使用了 4 + 7 + 2 + 5 = 18.
节省了 11 个char 的存储空间。
2. Delta
在lucene中需要保存很多整型的信息, 比如文档的id, Term的位置信息,当文档渐渐变多的时候,这些数字会越来越大,所占用的Byte也越来越多,Delta的意思就是两个整数,仅仅保存两个整数的差值.
比如: 5 9 11 存储为 5 4 2
3. markbit
某个值a后面可能存在b,也可能不存在, 需要一个标志位来表示是否存在b。
在lucene 中把a的值左移一位,空出最后一位作为标志位,表示后面是否跟随b,在这种情况下,a/2才是真正的值。
4. skip list
为了提高查询速度,lucene中有很多地方都是用了这种数据结构。
skip list 具有如下的特征:
1. 元素是按书序排列的,比如字母序或者从小到大。
2. 跳跃表是有间隔的,间隔是事先配置好的。
3. 跳跃表是有层次的,每一层指定间隔的元素构成上一层。
lucene中得定义:
间隔: 上层两个元素之差,再加一。
层数: 不包括原来链表层, 上面的层从0来时累加。
跳跃表比顺序查询,大大调高了搜索的效率.
比如查找元素72,应用跳表之后只需要访问第一层的50 ,然后发现50后面没有元素,然后访问第二层的94,然后访问原链表,找到72 ,只要访问3个元素即可。