Lucene存储结构(高级) | 学习笔记

简介: 快速学习Lucene存储结构(高级)。

开发者学堂课程【Lucene知识精讲与实战(下)Lucene存储结构(高级)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/701/detail/12350


Lucene存储结构(高级)


一、Luene储存结构

1Lucene 包含索引和文档,索引相当于字典中的目录,文档就相当于字典中的内容,查询时通过索引找文档,速度很快,这种结构是倒开索引结构。

2、灰色部分是 segment 段,物理结构,在硬盘中是真实存在的文件的。

4.1.png

打开索引库,可以看到 segment_1 段文件。

4.2.png

索引文档是逻辑结构,没有真实文件存在,逻辑结构存在段 segment 中,segment 段文件在索引库中文件可以有一个,也可以有多个,如果在里面写数据,索引库维护做增删改时,不是通过硬盘往段里写数据,效率比较慢,因为一个一个写会涉及到频繁的磁盘io操作,对于硬盘写入速度和读取速度是有上限的,上限很小,很容易达到上限,为了加快速度往磁盘中段中写索引和文档,但是先写内存中的缓存区域,达到一定的量之后,批量的把数据一次性写入真实的硬盘中,segment 段,segment 段大小有上限,达到最大上限后,自动再创建出 segment 段文件,segment_2segment_3,每个 Lucene 版本, segment 段上限大小不一样,上限可以通过方法和参数进行设置,手动修改。

3、段为了提高读写的效率,段不允许同时有两个线程进行操作,一个增加,一个删减,段就会被锁住,任何人都没有办法操作它。里面有个文件是锁,写锁,同时只能有一个线程操作它,防止数据出错。

4.3.png

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、索引库文件扩展名对照表中有很多文件,由 sfecfssi,重复的。

4.4.png

名称

文件扩展名

简短描述

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 等其他的后缀文件。

4.5.png

 

相关文章
|
5月前
|
算法 索引
一篇文章讲明白Lucene学习总结之九:Lucene的查询对象(2)
一篇文章讲明白Lucene学习总结之九:Lucene的查询对象(2)
21 0
|
存储 自然语言处理 JavaScript
【ElasticSearch从入门到放弃系列 三】Lucene的基本概念和使用(上)
【ElasticSearch从入门到放弃系列 三】Lucene的基本概念和使用(上)
138 1
|
自然语言处理 Java 索引
【ElasticSearch从入门到放弃系列 三】Lucene的基本概念和使用(下)
【ElasticSearch从入门到放弃系列 三】Lucene的基本概念和使用(下)
84 0
【ElasticSearch从入门到放弃系列 三】Lucene的基本概念和使用(下)
|
存储 缓存 NoSQL
数据库索引结构 | 学习笔记
快速学习数据库索引结构
数据库索引结构 | 学习笔记
|
存储 自然语言处理 搜索推荐
Elasticsearch 学习笔记(一)-----Lucene的简介以及索引原理
今天,正式开始学习Elasticsearch,因为Elasticsearch是用Lucene来实现索引的查询功能的,所以,理解Lucene的原理显的尤为重要。
575 0
Elasticsearch 学习笔记(一)-----Lucene的简介以及索引原理
|
SQL 缓存 关系型数据库
Java开发 - 数据库索引的数据结构
Java开发 - 数据库索引的数据结构
149 0
Java开发 - 数据库索引的数据结构
|
存储 Java 索引
Lucene的基本操作
Lucene的基本操作
96 0
Lucene的基本操作
|
存储 数据采集 自然语言处理
lucene 索引流程详细分析|学习笔记
快速学习 lucene 索引流程详细分析
153 0
lucene 索引流程详细分析|学习笔记
|
存储 关系型数据库 数据库
【数据库专题】一文搞懂 B+树凭什么成为关系型数据库索引的主流数据结构
【数据库专题】一文搞懂 B+树凭什么成为关系型数据库索引的主流数据结构
【数据库专题】一文搞懂 B+树凭什么成为关系型数据库索引的主流数据结构
|
存储 人工智能 自然语言处理
看Lucene源码必须知道的基本概念
下面的一些基本概念不但有助于看源码,在使用像solr这样的搜索引擎框架的时候还可以知道自己的配置都做了些什么事情。我在定义这些概念的时候也都有自己的理解和思考。
看Lucene源码必须知道的基本概念