Apache Lucene 7.0 - 索引文件格式

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 中文件的名称和扩展名:

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

锁文件

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/104101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue面试题-应用层

MVC与MVVM MVCMVVM 双向数据绑定 vue2 双向绑定原理 v-model原理 vue3 双向绑定原理 示例 对比 vue2响应式原理和Vue3响应式原理 data为什么是函数?v-if 与 v-show MVC与MVVM MVC和MVVM是两种流行的设计模式,它们都是用于构建动态应用程序的框架。 MVC MVC&#…

【重拾C语言】十一、外部数据组织——文件

目录 前言 十一、外部数据组织——文件 11.1 重新考虑户籍管理问题——文件 11.2 文件概述 11.2.1 文件分类 11.2.2 文件指针、标记及文件操作 11.3 打开、关闭文件 11.4 I/O操作 11.4.1 字符读写 11.4.2 字符串读写 11.4.3 格式化读写 11.4.4 数据块读写 11.4.5 …

【神经网络】如何在Pytorch中从零开始将MNIST网络量化为8位

论文: Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference 下载地址:https://arxiv.org/pdf/1712.05877.pdf 更新:量化感知训练的博客文章是在线的,并在这里链接,通过它我们可以训…

c++可变参数模板

不要做一个清醒的堕落者文章目录 可变参数模板的简介什么是可变参数 模板参数包参数包数据的获取(函数递归获取)参数包的获取(逗号表达式获取) 可变参数的应用emplace 可变参数模板的简介 c11添加的新特性能够让你创建可以接受改变的函数模板和类模板,C98/03&#…

LCR 095. 最长公共子序列(C语言+动态规划)

1. 题目 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08…

权限管理与jwt鉴权

权限管理与jwt鉴权 学习目标: 理解权限管理的需求以及设计思路实现角色分配和权限分配 理解常见的认证机制 能够使用JWT完成微服务Token签发与验证 权限管理 需求分析 完成权限(菜单,按钮(权限点),A…

最详细STM32,cubeMX 按键点亮 led

这篇文章将详细介绍 如何在 stm32103 板子上使用 按键 点亮一个LED. 文章目录 前言一、如何控制按键?为什么按键要接上拉电阻或者下拉电阻呢? 二、cubeMX配置工程自动生成代码解析 三、读取引脚电平函数四、按键为什么要消抖如何消除消抖 五、实现按键控…

电子笔记真的好用吗?手机上适合记录学习笔记的工具

提及笔记,不少人都会和学习挂钩,的确学习过程中我们经常会遇到很多难题,而经常记录笔记可以有效地帮助大家记住很多知识,而且时常拿出笔记查看一下,可方便巩固过去学习的知识。 手机作为大家日常随身携带的工具&#…

ArcGIS API for Android中针对MapView设置setOnTouchListener监听

在ArcGIS API for Android中,MapView通常只能设置一个OnTouchListener,这意味着你不能直接为同一个MapView对象多次调用setOnTouchListener方法,以添加多个不同的触摸监听器。 如果你需要多个不同的触摸监听器来处理不同类型的触摸事件,通常的做法是在一个OnTouchListener…

如何做系统架构设计

文章目录 1、如何进行架构设计体系架构需求体系架构设计体系架构文档化体系架构复审体系架构实现体系架构演化 2、架构设计注意事项分治原则服务自治拥抱变化可维护性考虑依赖和限制阅读代码注意事项 3、最后 ​系统架构应该如何设计,从自己做架构的经历来分享一些体…

mock

简单使用 在Java中,单元测试是一种测试方法,用于验证代码的各个组件(通常是单个方法或类)是否按预期工作。在单元测试中,有时需要模拟外部依赖,以确保测试的隔离性。为此,通常会使用模拟测试工…

idea 启动出现 Failed to create JVM JVM Path

错误 idea 启动出现如下图情况 Error launching IDEA If you already a 64-bit JDK installed, define a JAVA_HOME variable in Computer > System Properties> System Settings > Environment Vanables. Failed to create JVM. JVM Path: D:\Program Files\JetB…

【Java常见的几种设计模式】

Java常见的几种设计模式 1. 单例模式(Singleton Pattern)2. 工厂模式(Factory pattern)3. 抽象工厂模式(Abstract Factory Pattern)4. 建造者模式(Builder Pattern)5. 原型模式&…

【ICer的脚本练习】tcl语法熟悉和工具tcl的实例

系列的目录说明请见:ICer的脚本练习专栏介绍与全流程目录_尼德兰的喵的博客-CSDN博客 前言 TCL(Tool Command Language)是一种简单但功能强大的脚本语言,它经常用于自动化任务、测试和快速原型开发。你看这个名字就能知道,这个语言最主要的作用就是用来操作工具,尤其我们…

[软考中级]软件设计师-uml

事物 uml中有4中事物,结构事物,行为事物,分组事物和注释事物 结构事物是uml模型中的名词,通常是模型的静态部分,描述概念或物理元素 行为事物是uml的动态部分,是模型中的动词,描述了跨越时间…

appium---如何判断原生页面和H5页面

目前app中存在越来越多的H5页面了,对于一些做app自动化的测试来说,要求也越来越高,自动化不仅仅要支持原生页面,也要可以H5中进行操作自动化, webview是什么 webview是属于android中的一个控件,也相当于一…

Go语言变量学习

您可以阅读Golang 教程第 2 部分:如何运行Hello World以及IDE介绍 什么是变量? 变量是为存储特定类型值的内存位置指定的名称。Go 中有多种声明变量的语法。让我们一一看看。 声明单个变量 var name type是声明单个变量的语法。 package mainimport…

vue3模板-vscode设置(语法糖)

选择菜单里的 文件 > 首选项 > 用户代码片段 vscode模板 {"Print to conaole":{"prefix": "v-ts", //在新建立的页面中输入C就会有智能提示&#xff0c;Tab就自动生成好了"body": ["<template>"," <…

快手新版本sig3参数算法还原

Frida Native层主动调用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81…

C++之委托构造函数实例(二百四十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…