Lucene8索引及文件格式的基本概念

背景

在社区中看到有人提出一个问题,大意就是为什么启用压缩之后占用的空间大小为什么没变小。
原地址是ES索引默认的压缩功能有效果吗?

image.png

问题分析

其实这个问题就涉及到Lucene的文件结构了,Elasticsearch统计的存储空间中包括了很多内容,不止包括原文档,还有所有字段的索引,而Elasticsearch中对文档的压缩也仅限于_source这个存储了原JSON格式的字段(实际上应该是fdt这个文件的压缩方式,默认是LZ4),因此可能会出现这个朋友发现的这种情况。今天有时间我就来整理一下Lucene的文件结构。

另外,提问中的空间大小还涉及到了segment的多少,一般来说,刚完成数据索引的索引,如果segment比较多也可能会占用更大的空间。

Lucene文件

基本概念

Lucene 有几个关键词,indexdocumentfield和term`。

index 包括 很多document,就像是一张表有很多行记录。
document包括很多field,就像一条记录的不同字段。

term 这个概念就不能简单的用关系型数据库来理解了,但是也可以想象成,字段中的数据,但是这个字段的数据是数组形式,一个term就是数组中的一个值。

倒排索引

Lucene中用于存储索引的结构叫倒排索引Inverted Indexing,倒排索引时以term为单位的,对于文本字段来说,每个字段都会有一个倒排索引。

字段类型

在Lucene中的字段类型一共只有三种,文本,数值,二进制。

segment 段

一个索引有一个或者多个段组成,这样设计的原因是为了更方便的进行更新或者修改数据,而不会对旧的索引更新,防止大量更新的情况下影响搜索性能。
每当有新的文档进入,会按照批次创建新的段,然后持久化到磁盘中。
段只存在于磁盘。

文件编号

在内部,Lucene通过整数文档编号引用文档。添加到索引的第一个文档编号为零,并且添加的每个后续文档都比前一个更大。

请注意,文档的编号可能会更改,因此在将这些编号存储在Lucene之外时应小心。特别是,在以下情况下,数字可能会发生变化:

1. 存储在每个段中的数字仅在段内是唯一的,并且必须先进行转换才能在更大的上下文中使用。标准技术是根据该段中使用的数字范围为每个段分配一系列值。要将文档编号从段转换为外部值,请添加段的基本文档编号。要将外部值转换回特定于段的值,将通过外部值所在的范围来标识该段,并减去该段的基值。例如,可以组合两个五个文档段,使得第一个段的基值为零,五个中的第二个段。来自第二段的文档3的外部值为8。
2. 删除文档时,会在编号中创建间隙。随着索引通过合并演变,这些最终会被删除。合并段时删除已删除的文档。因此,新合并的细分市场的编号没有差距。

索引结构

每个段索引都保持以下内容:

  • Segment info。这包含有关段的元数据,例如文档数,它使用的文件,
  • Field names。它包含索引中使用的字段名称集。
  • Stored Field values。对于每个文档,这包含属性 - 值对的列表,其中属性是字段名称。这些用于存储有关文档的辅助信息,例如其标题,URL或访问数据库的标识符。存储的字段集是搜索时为每个匹配返回的字段。这是由文件编号键入的。
  • Term dictionary。包含所有文档的所有索引字段中使用的所有术语的字典。字典还包含包含该术语的文档数量,以及指向术语频率和接近度数据的指针。
  • Term Frequency data。对于字典中的每个术语,包含该术语的所有文档的编号以及该文档中术语的频率,除非省略频率(IndexOptions.DOCS_ONLY)
  • Term Proximity data。对于词典中的每个术语,术语在每个文档中出现的位置。请注意,如果所有文档中的所有字段都省略位置数据,则不存在此操作。
  • Normalization factors。对于每个文档中的每个字段,存储一个值,该值乘以该字段上的匹配分数。
  • Term Vectors。对于每个文档中的每个字段,可以存储术语向量(有时称为文档向量)。术语向量由术语文本和术语频率组成。要将术语向量添加到索引,请参阅 Field构造函数
  • Per-document values。DocValues ,用于排序,聚合
  • Live documents。一个可选文件,指示哪些文档是活动的。
  • Point values。可选的文件对,记录尺寸索引字段,以实现快速数值范围过滤和大数值,如BigInteger和BigDecimal(1D)以及地理形状交叉(2D,3D)。

有关这些内容的详细信息,请参见其链接页面。

文件命名

属于段的所有文件具有相同的名称和不同的扩展名。扩展名对应于下面描述的不同文件格式。使用复合文件格式(小段默认)时,这些文件(段信息文件,锁定文件和已删除文档文件除外)将折叠为单个.cfs文件(有关详细信息,请参阅下文)

通常,索引中的所有段都存储在单个目录中,但这不是必需的。

永远不会重复使用文件名。也就是说,当任何文件保存到目录时,它将被赋予一个前所未有的文件名。这是使用简单的世代方法实现的。例如,第一段文件是segments_1,然后是segments_2等。生成是以字母数字(基础36)形式表示的顺序长整数。

文件扩展名记录

image.png

lock锁

write.lock是存储于索引目录中,用来标识目前有进程在操作这个索引,防止多个writer同时写入产生错误。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容