Apache Lucene 7.0 - 索引文件格式

Apache Lucene 7.0 - 索引文件格式

文章目录

原文地址

介绍

这个文档定义了在这个版本的Lucene中使用的索引文件格式。如果您使用的是不同版本的Lucene,请查询对应版本的文档。

本文档试图提供Apache Lucene文件格式的高级定义。

定义

Lucene的基本概念是索引、文档、字段和术语(分词后的检索词)。

索引包含一系列文档。

文档是一系列字段。

  • 字段是一个命名的术语序列。
  • 术语是一个字节序列。
  • 两个不同字段中的相同字节序列被认为是不同的术语。因此,术语被表示为一对:命名字段的字符串和字段内的字节。

反向索引

索引存储有关术语的统计信息,以便使基于术语的搜索更有效。Lucene的索引属于被称为倒排索引的索引族。这是因为对于一个术语,它可以列出包含它的文档。这与文档列出术语的自然关系相反。

字段类型

在Lucene中,字段可以被存储,在这种情况下,它们的文本以一种非反向的方式逐字存储在索引中。倒置的字段称为索引。一个字段可以被存储和索引。

字段的文本可以被标记成要索引的术语,或者字段的文本可以按字面意思用作要索引的术语。大多数字段都是标记化的,但有时对某些标识符字段进行逐字索引是有用的。

有关Field的更多信息,请参阅Field java文档。

Lucene索引可以由多个子索引或段组成。每个段都是一个完全独立的索引,可以单独搜索。指数的演变:

为新添加的文档创建新的段。

  1. 合并现有段。
  2. 搜索可能涉及多个段和多个索引,每个索引可能由一组段组成。

文档数量

在内部,Lucene通过一个整数文档号来引用文档。添加到索引中的第一个文档编号为0,随后添加的每个文档的编号都比前一个文档大1。

注意文档的编号可能会改变,所以在Lucene之外存储这些编号时要小心。在以下情况下,数字可能会发生变化:

存储在每个段中的数字仅在该段内是唯一的,并且必须在将其用于更大的上下文中之前进行转换。标准技术是根据每个段中使用的数字范围为每个段分配一个值范围。要将文档号从段转换为外部值,需要添加段的基本文档号。为了将外部值转换回特定于段的值,段由外部值所在的范围标识,并减去段的基值。例如,可以组合两个5个文档段,使第一个段的基值为0,第二个段的基值为5。第二部分的文档3的外部值为8。

当文档被删除时,在编号中会产生空白。随着索引在合并过程中的演变,这些最终会被删除。在合并段时删除已删除的文档。因此,新合并的段在编号上没有间隙。

索引结构概述

每个段索引维护如下内容:

  • Segment info.它包含关于一个段的元数据,例如文档的数量,它使用的文件。
  • Field names. 它包含索引中使用的字段名称集。
  • Stored Field values. T对于每个文档,这包含一个属性值对列表,其中属性是字段名。它们用于存储关于文档的辅助信息,例如文档的标题、url或访问数据库的标识符。存储的字段集是在搜索时为每个命中返回的内容。这是由文档号输入的。
  • Term dictionary. 包含所有文档的所有索引字段中使用的所有术语的字典。字典还包含包含该术语的文档数量,以及指向该术语的频率和接近度数据的指针。
  • Term Frequency data. 对于字典中的每个术语,包含该术语的所有文档的编号,以及该术语在该文档中出现的频率,除非省略频率(IndexOptions.DOCS_ONLY)
  • Term Proximity data. 对于字典中的每个术语,表示该术语在每个文档中出现的位置。请注意,如果所有文档中的所有字段都省略位置数据,则不存在此方法。
  • Normalization factors. 对于每个文档中的每个字段,存储一个值,该值乘以该字段的命中分数。
  • Term Vectors. 对于每个文档中的每个字段,都可以存储术语向量(有时也称为文档向量)。术语向量由术语文本和术语频率组成。要在索引中添加术语向量,请参见 Field 构造函数
  • Per-document values.与存储值一样,这些值也是按文档编号键入的,但通常是为了快速访问而加载到主存 储器中。存储值一般用于搜索结果的汇总,而每个文档值则适用于评分因子等。
  • Live documents. 可选文件,说明哪些文件是实时文件。
  • Point values. 可选的一对文件,记录维度索引字段,以实现快速数值范围过滤和大数值,如 BigInteger 和 BigDecimal(1D)以及地理形状交叉(2D、3D)。

文件命名

属于一个段的所有文件具有相同的名称,但扩展名不同。扩展名对应于下面描述的不同文件格式。当使用复合文件格式(小段的默认格式)时,这些文件(段信息文件、锁文件和删除文档文件除外)被折叠成一个.cfs文件(详细信息见下文)。

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

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

文件扩展名摘要

下表总结了 Lucene 中文件的名称和扩展名:

Name Extension Brief Description
Segments File segments_N 存储有关提交点的信息,N随着commit的次数增长而增长
Lock File write.lock 写入锁文件,可防止多个 IndexWriters 向同一文件写入。
Segment Info .si 记录对应段的元数据
Compound File .cfs, .cfe 合并当前段内所有文件生产合并文件,.cfe扩展后缀的合并文件用于记 录合并之前段对应的所有文件的元信息,.cfs扩展后缀的合并文件存储的 是合并前段内所有文件的实际数据
Fields .fnm 记录index对应所有字段的信息
Field Index .fdx doc通过docId来标识被存储在.fdt的文件中,方便快速的查询到docid对 应的数据需要对doc数据做相关的索引位置记录
Field Data .fdt 存储doc数据的文件,只有设置Field.Store.YES的field对应的数据才会 被存储在该文件中
Term Dictionary .tim 术语词典,记录术语信息
Term Index .tip term被记录存储在.tim中,当term数据很大时需要对term进行索引方便 快速定位到对应的term
Frequencies .doc 记录包含每个术语的文档列表以及频率
Positions .pos 记录术语在索引中出现的位置
Payloads .pay 记录额外的每个位置元数据信息,如字符偏移和用户有效载荷
Norms .nvd, .nvm nvd保存索引文档字段的加权因子的数据,搜索时计算相关性的一个系数,nvm保存索引文档字段加权因子的元数据
Per-Document Values .dvd, .dvm dvd保存索引文档的评分因子,也用于存储docValues类型的字段数据,即 列存储(正向索引),dvm保存索引文档的评分因子的元数据
Term Vector Index .tvx 将偏移量存入文件数据文件
Term Vector Data .tvd 包含术语向量数据。
Live Documents .liv 有关实时文件的信息
Point values .dii, .dim 保存索引点(如果有)

锁文件

默认存储在索引目录中的写锁名为"write.lock"。如果锁目录与索引目录不同,那么写锁将被命名为"XXXX-write"。其中XXXX是从索引目录的完整路径派生的唯一前缀。当这个文件存在时,写程序当前正在修改索引(添加或删除文档)。这个锁文件确保一次只有一个写入器在修改索引。

相关推荐
醇氧1 小时前
ab (Apache Bench)的使用
linux·学习·centos·apache
大风吹PP凉3 小时前
34Web服务器(如Apache, Nginx)
服务器·nginx·apache
巨大八爪鱼16 小时前
XP系统下用mod_jk 1.2.40整合apache2.2.16和tomcat 6.0.29,让apache可以同时访问php和jsp页面
java·tomcat·apache·mod_jk
运维佬1 天前
在 Linux 系统上部署 Apache Solr
linux·apache·solr
infiniteWei1 天前
【Lucene】详细讲解创建索引的步骤:分词、去停用词、语言处理、倒排表构建
搜索引擎·全文检索·lucene
小蒜学长2 天前
校园周边美食探索及分享平台
java·spring boot·后端·spring·apache·美食
Elastic 中国社区官方博客2 天前
Lucene 和 Elasticsearch 中更好的二进制量化 (BBQ)
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·lucene
დ旧言~2 天前
【网络】子网掩码
服务器·网络·网络协议·tcp/ip·php·apache
Ops菜鸟(Xu JieHao)2 天前
Dockerfile构建镜像(练习一Apache镜像)(5-1)
服务器·docker·容器·apache·脚本·dockerfile·系统运维
Percep_gan2 天前
Apache服务安装
apache