Lucene技巧分析
来源:互联网 发布:linux 自动挂载硬盘 编辑:程序博客网 时间:2024/06/07 20:32
Lucene中用到的一些设计,主要是为了满足2个特点:1存储小;2检索快。
这里把Lucene里用到的技巧单独领出来了解下,是为了多学习一些优秀的算法,开阔思路,在工作中万一遇到类似的场景可以学以致用。
技巧一:
Prefix+Suffix记录
在前面的原理学习中我们已经知道lucene的term在字典中是按照顺序排序的,这就为Prefix+Suffix的记录方式奠定了先决条件。
所谓的Prefix+Suffix,是当前一个词是后一个词组成的一部分时,利用一个偏移量来代替具体字符串,以减少存储空间。
例如要存储如下词:term,termagancy,termagant,terminal
照正常方式来存储:
[VInt = 4] [t][e][r][m],[VInt =10][t][e][r][m][a][g][a][n][c][y],[VInt = 9][t][e][r][m][a][g][a][n][t],
[VInt = 8][t][e][r][m][i][n][a][l]
用前缀后缀规则来储存:
[VInt = 4] [t][e][r][m],[VInt = 4(offset)][VInt = 6][a][g][a][n][c][y],[VInt = 8(offset)][VInt = 1][t],
[VInt = 4(offset)][VInt = 4][i][n][a][l]
占用空间比是35:22,节约了三分之一空间,前后term相似性越高该算法效果越好,而lucene的term正好是按顺序排序的。
技巧二:
差值算法
在 Lucene的反向索引中,需要保存很多整型数字的信息,比如文档 ID号,比如词(Term)在文档中的位置等等。
Lucene中整数的存储类型是VInt(变长整数类型):每个VInt由多个 Byte,对于每个 Byte的 8位,其中后 7位表示数值,最高 1位表示是否还有另一个Byte,0表示没有,1表示有。130化为二进制为 1000, 0010,VInt的第一个 Byte 表示后 7位,并且在最高位置 1来表示后面还有一个 Byte,所以为(1) 0000010,第二个 Byte表示第 8位,并且最高位置 0来表示后面没有其他的 Byte了,所以为(0) 0000001。所以130在lucene里存储是10000010、00000001。
VInt的结构决定了随着数值的增大,每个数字占用的Byte的个数也逐渐的增多。所谓差值规则(Delta)就是先后保存两个整数的时候,后面的整数仅仅保存和前面整数的差即可。
以:16386,16387,16388,16389为例
照正常方式来存储,需要的空间如下:
[(1) 000, 0010][(1) 000, 0000][(0) 000,0001],[(1) 000, 0011][(1) 000, 0000][(0) 000, 0001],[(1)
000, 0100][(1) 000, 0000][(0) 000, 0001],[(1) 000,0101][(1) 000, 0000][(0) 000, 0001]
应用差值规则来存储,需要的空间如下:
[(1) 000, 0010][(1) 000, 0000][(0) 000,0001],[(0) 000, 0001],[(0) 000, 0001],[(0) 000, 0001]
空间占用量12:6,节省了1半。数字之间差距越小空间利用率越高,而lucene中无论是文档 ID,还是词在文档中的位置,都是按从小到大的顺序,逐渐增大的。
技巧三:
跳跃表规则
使用跳跃表规则的前提是数据必须是排序的,跳跃表中的间隔和层次两个概念比较好理解,直接上图
这个不细说,跟跳跃表也有好多变种,例如随机跳跃等,本质是牺牲存储换取搜索效率,平衡性靠跳跃间隔和层次来决定。
- Lucene技巧分析
- Lucene.net技巧
- lucene使用技巧
- Lucene-Analysis包分析
- Lucene的特性分析
- Lucene的特性分析
- Lucene架构简单分析
- Lucene的特性分析
- Lucene系统结构分析
- lucene系统结构分析
- lucene分析器分析
- Lucene源码分析-- Analyzer
- lucene 源码分析
- lucene文件格式分析
- Lucene 结构分析
- lucene-Nutch分析
- Lucene索引文件格式分析
- lucene索引结构分析
- 初识kotlin实现一个类似烟花效果的自定义view
- 【20170926】C语言每日一练
- 洛谷 P1631 序列合并
- App在appstore下架的方法
- SpringBoot入门:(2)jpa方式操作数据库
- Lucene技巧分析
- 注解式框架--Butterknife的使用
- IAR 问题集
- 关于在caddy环境下,使用https协议UC无法下载的解决方法。
- 树莓派spi超频的方法
- Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
- MeasureSpecMode 的三个值都是什么意思?
- 300.19读取一个文件中各字出现的次数
- 改变一生的闪念