开发者学堂课程【Lucene知识精讲与实战(下):Lucene存储结构(高级)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/701/detail/12350
Lucene存储结构(高级)
一、Luene储存结构
1、Lucene 包含索引和文档,索引相当于字典中的目录,文档就相当于字典中的内容,查询时通过索引找文档,速度很快,这种结构是倒开索引结构。
2、灰色部分是 segment 段,物理结构,在硬盘中是真实存在的文件的。
打开索引库,可以看到 segment_1 段文件。
索引文档是逻辑结构,没有真实文件存在,逻辑结构存在段 segment 中,segment 段文件在索引库中文件可以有一个,也可以有多个,如果在里面写数据,索引库维护做增删改时,不是通过硬盘往段里写数据,效率比较慢,因为一个一个写会涉及到频繁的磁盘io操作,对于硬盘写入速度和读取速度是有上限的,上限很小,很容易达到上限,为了加快速度往磁盘中段中写索引和文档,但是先写内存中的缓存区域,达到一定的量之后,批量的把数据一次性写入真实的硬盘中,segment 段,segment 段大小有上限,达到最大上限后,自动再创建出 segment 段文件,segment_2,segment_3,每个 Lucene 版本, segment 段上限大小不一样,上限可以通过方法和参数进行设置,手动修改。
3、段为了提高读写的效率,段不允许同时有两个线程进行操作,一个增加,一个删减,段就会被锁住,任何人都没有办法操作它。里面有个文件是锁,写锁,同时只能有一个线程操作它,防止数据出错。
4、segment 进行增删改时,对于段文件是不允许在原有的内容中进行修改的,从段中找到文档文件,把它删除,删除后再在段末尾的位置添加新的内容,这就是修改,在索引维护的章节中做过实验,修改不是直接update进行修改,是把原来 with 数据删除,在文档最后的位置追加上去,好处是减少磁盘的随机io操作,加快读写的效率。
5、段中存的索引存的文档,索引中有关键字,查找关键字,再对应找到哪个文档编号,通过文档编号找到对应的文档,像类似于查字典,倒拍顺序表算法,索引里面存放三个东西,一个是关键字,另一列文档号,出现的位置。关键字是通过文档正文内容切割出来的,去掉空格,去掉标点符号,大写字母转成小写字母,去掉重复的词组成,关键字最大的长度是字典加词典加英文牛津词典,cpu 运算次数每秒可以达到几十亿次甚至更多,所以速度很快,查询关键字对应存上了文档号,文档号是在创建文档正文时 Lucene 会为文档分配唯一的 ID ,不会重复,词是从文档中来的,词同时从两个文档中来,所以可以记很多个文档号,通过查询关键词找到文档编号,通过文档编号能找到文档的正文内容,文档可能几十个g,从里面找到具体的位置速度还是很慢,所以又记住了出现的位置,在第多少的字符上,有这个词通过关键词找到对应的文档编号,通过文档编号能找到文档,又有出现的位置,直接就能定位到具体的内容,查询速度非常快,这是底层的存储结构。
6、在文档中包含域,域是 k value 格式,k 是域名,value 是域值,相当于在数据库表中,某一行某一列具体的值,值是由一个一个 term 组成的,term 相当于一个一个词做成一篇文章。
7、查询快,通过查询关键字,找到文档号,找到出现的位置,找到具体里面出现的位置,查询关键字时是利用顺序扫描法,跟关键词进行一个一个对比,速度快不了太多,在查询关键字时,关键字存储的结构还会再讲,讲词典里存储的结构,结构会涉及到一些算法,比如跳找算法,fst 算法,每一个 Lucene 版本,关键字排序算法不一样,由于排序算法不一样,所以查关键时效率不一样。
8、索引库物理文件
_3.cfs
_4.cfs
_5.cfs
_6.cfe
_6.cfs
_6.si
segments_ b
write.lock
9、索引库文件扩展名对照表中有很多文件,由 sfe,cfs,si,重复的。
名称 |
文件扩展名 |
简短描述 |
Segments File |
segments_ N |
保存了一个提交点(a commit point)的信息 |
Lock File |
write.lock |
防止多个IndexWriter同时写到一份索引文件中 |
Segment Info |
.si |
保存了索引段的元数据信息 |
Compound File |
.cfs, .cfe |
一个可选的虚拟文件,把所有索引信息都存储到复合索引文件中 |
Fields |
.fnm |
保存fields的相关信息 |
Field Index |
.fdx |
保存指向field data的指针 |
Field Data |
.fdt |
文档存储的字段的值 |
Term Dictionary |
.tim |
term词典,存储term信息 |
Term Index |
.tip |
到Term Dictionary的索引 |
Frequencies |
.doc |
由包含每个term以及频率的docs列表组成 |
Positions |
.pos |
存储出现在索引中的term的位置信息 |
Payloads |
.pay |
存储额外的per-position元数据信息,例如字符偏移和用户payloads |
Norms |
.nvd, .nvm |
.nvm文件保存索引字段加权因子的元数据,.nvd文件保存索引字 |
Per-Document Values |
.dvd, .dvm |
.dvm文件保存索引文档评分因子的元数据,.dvd文件保存索引文档评分数据 |
Term Vector Index |
.tVX |
将偏移存储到文档数据文件中 |
Term Vector |
.tvd |
包含有term vectors的每个文档信息 |
Documents |
.tvf |
字段级别有关term vectors的信息 |
Term Vector Fields |
.liv |
哪些是有效文件的信息 |
Live Documents |
.dii,.dim |
保留索引点,如果有的话 |
都是用复合索引文件表示,这是 Lucene7.2 默认的存储格式,在早期的 Lucene 中还有 .doc 等其他的后缀文件。