Lucene(8):Lucene底层储存结构

news2025/1/11 9:53:09

1 详细理解lucene存储结构

存储结构 :

索引(Index) :

  • 一个目录一个索引,在Lucene中一个索引是放在一个文件夹中的。

段(Segment) :

  • 一个索引(逻辑索引)由多个段组成, 多个段可以合并, 以减少读取内容时候的磁盘IO。
  • Lucene中的数据写入会先写内存的一个Buffer,当Buffer内数据到一定量后会被flush成一个Segment,每个Segment有自己独立的索引,可独立被查询,但数据永远不能被更改。这种模式避免了随机写,数据写入都是批量追加,能达到很高的吞吐量。Segment中写入的文档不可被修改,但可被删除,删除的方式也不是在文件内部原地更改,而是会由另外一个文件保存需要被删除的文档的DocID,保证数据文件不可被修改。Index的查询需要对多个Segment进行查询并对结果进行合并,还需要处理被删除的文档,为了对查询进行优化,Lucene会有策略对多个Segment进行合并。

文档(Document) :

  • 文档是我们建索引的基本单位,不同的文档是保存在不同的段中的,一个段可以包含多篇文档。
  • 新添加的文档是单独保存在一个新生成的段中,随着段的合并,不同的文档合并到同一个段中。

域(Field) :

  • 一篇文档包含不同类型的信息,可以分开索引,比如标题,时间,正文,描述等,都可以保存在不同的域里。
  • 不同域的索引方式可以不同。

词(Term) :

  • 词是索引的最小单位,是经过词法分析和语言处理后的字符串。

 

2 索引库物理文件

3 索引库文件扩展名对照表 

名称

文件扩展名 简短描述

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

.timterm词典,存储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 Documents

.tvd包含有term vectors的每个文档信息

Term Vector Fields

.tvf字段级别有关term vectors的信息

Live Documents

.liv哪些是有效文件的信息

Point values

.dii,.dim保留索引点,如果有的话

4 词典的构建

为何Lucene大数据量搜索快, 要分两部分来看 :

  • 一点是因为底层的倒排索引存储结构。
  • 另一点就是查询关键字的时候速度快, 因为词典的索引结构。

4.1 词典数据结构对比

倒排索引中的词典位于内存,其结构尤为重要,有很多种词典结构,各有各的优缺点,最简单如排序数组,通过二分查找来检索数据,更快的有哈希表,磁盘查找有B树、B+树,但一个能支持TB级数据的倒排索引结构需要在时间和空间上有个平衡,下图列了一些常见词典的优缺点:

数据结构优缺点
跳跃表占用内存小,且可调,但是对模糊查询支持不好
排序列表Array/List使用二分法查找,不平衡
字典树查询效率跟字符串长度有关,但只适合英文词典
哈希表性能高,内存消耗大,几乎是原始数据的三倍
双数组字典树适合做中文词典,内存占用小,很多分词工具均采用此种算法
Finite State Transducers (FST)一种有限状态转移机,Lucene 4有开源实现,并大量使用
B树磁盘索引,更新方便,但检索速度慢,多用于数据库

Lucene3.0之前使用的也是跳跃表结构,后换成了FST,但跳跃表在Lucene其他地方还有应用如倒排表合并和文档号索引。

4.2 跳跃表原理

Lucene3.0版本之前使用的跳跃表结构后换成了FST结构

优点 :结构简单、跳跃间隔、级数可控,Lucene3.0之前使用的也是跳跃表结构,,但跳跃表在

Lucene其他地方还有应用如倒排表合并和文档号索引。

缺点 :模糊查询支持不好。

单链表 :

单链表中查询一个元素即使是有序的,我们也不能通过二分查找法的方式缩减查询时间。

通俗的讲也就是按照链表顺序一个一个找。

举例: 查找85这个节点, 需要查找7次。

 

跳跃表:

举例: 查询85这个节点, 一共需要查询6次.

  1. 在level3层, 查询3次, 查询到1结尾, 退回到37节点
  2. 在level2层, 从37节点开始查询, 查询2次, 查询到1结尾, 退回到71节点
  3. 在level1层, 从71节点开始查询, 查询1次, 查询到85节点.

4.3 FST原理简析

Lucene现在采用的数据结构为FST,它的特点就是: 优点:内存占用率低,压缩率一般在3倍~20倍之间、模糊查询支持好、查询快 缺点:结构复杂、输入要求有序、更新不易。

已知FST要求输入有序,所以Lucene会将解析出来的文档单词预先排序,然后构建FST,我们假设输入为abd,abe,acf,acg,那么整个构建过程如下:

 

输入数据:

String inputValues[] = {"hei","ma","cheng","xu","yuan","good"};
long outputValues[] = {0,1,2,3,4,5};

输入的数据如下:

hei/0

ma/1

cheng/2

xu/3

yuan/4

good/5

存储结果如下:

 

 

 

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

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

相关文章

公共场所人流数据统计如何实现?解决重识别、漏检等检测难题

https://github.com/PaddlePaddle/paddledetection当前疫情形势严峻,商场、火车站、地铁口等公共场所对人员流量的统计至关重要。“每天进出多少人?” “现在商场中人员数量有多少?”这些关键数据直接影响到相关防疫管控措施。因为人员基数较…

shardingsphere5.x整合springboot分库分表实战

官方文档不同版本配置变更记录&#xff1a;Spring Boot Start 配置 :: ShardingSphere pom.xml配置&#xff1a; <!--shardingsphere分库分表依赖--> <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jd…

分布式锁原理与实战一:分布式锁简介

跨JVM的线程安全问题 在单体的应用开发场景中&#xff0c;在多线程的环境下&#xff0c;涉及并发同步的时候&#xff0c;为了保证一个代码块在同一时间 只能由一个线程访问&#xff0c;我们一般可以使用 synchronized 语法和 ReetrantLock 去保证&#xff0c;这实际上是本地锁…

指针--间接寻址运算符

通常&#xff0c;只要指明要访问的变量的内存地址&#xff0c;即可直接访问变量所在的存储单元中的内容。在前面都是直接通过变量名来访问变量的内容。直接按变量名或者变量的地址存取变量的内容的访问方式&#xff0c; 称为 直接寻址&#xff08;Direct Addressing&#xff09…

STM32读取BH1750光照强度数据打印到串口

【1】BH1750是什么&#xff1f; BH1750是一种数字式环境光强度传感器&#xff08;Digital Light Sensor&#xff09;&#xff0c;也称为其他名称&#xff0c;例如GY-302传感器、BH1750FVI传感器等。它的工作原理是通过收集光线照射到传感器上的量来测量环境亮度。 使用I2C&am…

操作系统 第三章 3.2 错题整理

页面引用串长度是什么意思 合法位存在位 不存在即发生故障 区分好页表项和逻辑地址 是不同的 逻辑地址48bit 偏移量12bit 页号36bit 页表项8B 4KB/8B2^9 一个页面能存放2^9个页表项 页号9bit&#xff0c;36/94 虚拟存储器包括内存和磁盘对换区&#xff0c;工作集要频繁用到&…

深度学习:使用UNet做图像语义分割,训练自己制作的数据集,详细教程

语义分割(Semantic Segmentation)是图像处理和机器视觉一个重要分支。与分类任务不同&#xff0c;语义分割需要判断图像每个像素点的类别&#xff0c;进行精确分割。语义分割目前在自动驾驶、自动抠图、医疗影像等领域有着比较广泛的应用。我总结了使用UNet网络做图像语义分割的…

我们不一样-康耐视visionpro和apple vision pro

​ 机器视觉Halcon-不同颜色快速识别 康耐视Visionpro是美国cognex visionpro。 康耐视 VisionPro 是领先的计算机式视觉软件。它主要用于设置和部署视觉应用 - 无论是使用相机还是图像采集卡。借助 VisionPro,用户可执行各种功能,包括几何对象定位和检测、识别、测量和对准…

【Web服务应用】LVS负载均衡集群

LVS负载均衡集群 一、企业级集群含义1.1集群的含义1.2LVS一些专业术语 二、企业集群分类2.1负载均衡集群2.2高可用集群2.3高性能运算集群&#xff08;High Performance Computer Cluster&#xff09; 三、负载均衡的架构3.1负载均衡的结构 四、负载均很集群的工作模式4.1NAT模式…

JDBC连接数据库步骤(入门到进阶全)

目录 一、JDBC是什么&#xff1f; 二&#xff0c;JDBC的本质是什么&#xff1f; 为什么要用面向接口编程&#xff1f; 三、JDBC实现原理 四、使用idea开发JDBC代码配置驱动 ​编辑 五、JDBC编程六步概述 六、JDBC编程实现 1.插入实现 2.删除与更新实现 3 .类加载的方式注…

Jetson AGX Orin安装Anaconda、Cuda、Cudnn、Pytorch、Tensorrt最全教程

文章目录 一&#xff1a;Anaconda安装二&#xff1a;Cuda、Cudnn安装三&#xff1a;Pytorch安装四&#xff1a;Tensorrt安装 一&#xff1a;Anaconda安装 Jetson系列边缘开发板&#xff0c;其架构都是arm64&#xff0c;而不是传统PC的amd64&#xff0c;深度学习的环境配置方法…

chatgpt赋能python:Python对接技术在SEO中的应用

Python对接技术在SEO中的应用 Python作为一种高性能的编程语言&#xff0c;被广泛应用于各种领域&#xff0c;其中也包括了搜索引擎优化&#xff08;SEO&#xff09;领域。Python对接技术&#xff0c;也称为API对接技术&#xff0c;是指通过调用API接口来获取数据、信息或实现…

AI数字人打造之sadtalker让照片开口说话

1 sadtalker介绍 西安交通大学也开源了人工智能SadTalker模型&#xff0c;通过从音频中学习生成3D运动系数&#xff0c;使用全新的3D面部渲染器来生成头部运动&#xff0c;可以实现图片音频就能生成高质量的视频。 论文地址&#xff1a;Learning Realistic 3D Motion Coefficie…

chatgpt赋能python:Python屏蔽语句的重要性

Python屏蔽语句的重要性 Python是一种高级程序设计语言&#xff0c;被认为是开发Web应用程序、数据科学和人工智能的最佳语言之一。在编写Python程序时&#xff0c;每个人都会遇到需要屏蔽语句的情况。在本文中&#xff0c;我们将详细介绍Python屏蔽语句的重要性和用法。 什么…

chatgpt赋能python:Python建模仿真:优秀的工具与技巧

Python建模仿真&#xff1a;优秀的工具与技巧 在现代科技时代&#xff0c;建模仿真是许多不同行业的核心部分&#xff0c;帮助工程师和科学家研究解决许多问题。Python作为一种简单易学且强大的语言&#xff0c;已经被广泛应用于建模仿真领域。 Python的优点 Python在建模仿…

用Python进行数学建模(一)

一、导入数据 1.直接赋值 2.读取 Excel 文件 3.代码示例 import pandas as pd# 读取数据文件 def readDataFile(readPath): # readPath: 数据文件的地址和文件名try:if (readPath[-4:] ".csv"):dfFile pd.read_csv(readPath, header0, sep",") # 间隔…

chatgpt赋能python:Python嵌入C:一个高效的编程技巧

Python嵌入C&#xff1a;一个高效的编程技巧 作为一名有10年Python编程经验的工程师&#xff0c;我发现在某些情况下&#xff0c;Python嵌入C是一种高效的编程技巧。这种技巧可以使您利用Python的简洁性和高级功能&#xff0c;同时仍然保持程序的执行速度。在本文中&#xff0…

chatgpt赋能python:Python对接硬件:从入门到精通

Python对接硬件&#xff1a;从入门到精通 Python是一门极为强大的编程语言&#xff0c;它不只是用来进行数据分析和Web开发的&#xff0c;也可以用来对接各种硬件设备。这是因为Python具有简单易学&#xff0c;语法简洁&#xff0c;库众多的优点。 什么是Python对接硬件 Pyt…

通过AI工具(ChatGPT接口)生成一字未改的论文,查重率4.2%,可以直接当作论文使用

论文题目&#xff1a;基于AIOT技术的能源控制器的设计以及应用 查重结果&#xff1a;4.2% AI工具国内体验&#xff0c;关注&#xff1a;码视野&#xff0c;回复关键字&#xff1a;1002 一、引言 随着全球经济的快速发展和人口的增长&#xff0c;对能源的需求日益增加。然而&…

nodejs环境变量配置问题记录

问题一&#xff1a;Error: EPERM: operation not permitted, open ‘D:\Program Files\nodejs\node_cache\_cacache\tmp\bccd20 这个问题主要是没有权限导致的。 问题二&#xff1a;使用node命令提示 ‘node‘ 不是内部或外部命令&#xff0c;也不是可运行的程序 这个错误是环…