ElasticSearch学习篇8_Lucene之数据存储(Stored Field、DocValue、BKD Tree)

前言

Lucene全文检索主要分为索引、搜索两个过程,对于索引过程就是将文档磁盘存储然后按照指定格式构建索引文件,其中涉及数据存储一些压缩、数据结构设计还是很巧妙的,下面主要记录学习过程中的StoredField、DocValue以及磁盘BKD Tree的一些相关知识。

参考:

  • https://juejin.cn/post/6978437292549636132
  • https://juejin.cn/user/2559318800998141/posts
  • Lucene 原理与代码分析完整版.pdf
  • https://lucene.apache.org/core/9_9_0/core/org/apache/lucene/codecs/lucene99/package-summary.html#package.description
  • 美团外卖搜索基于 Elasticsearch 的优化实践

目录

  • Lucene数据分类
  • Lucene字段存储

1、Lucene数据分类

在Lucene中索引数据存储的逻辑层次有多个层次,从大到小依次是

  • index:索引代表了一类数据的完整存储
  • segment: 一个索引可能有一个或者多个段构成
  • doc: segment中存储的是一篇一篇的文档doc,每个segment是一个doc的集合
  • field: 每个doc都有多个field构成,filed才包含了具体的文本,类似于一个json对象的一个属性
  • term: 每个field的值可以进行分词,进而得到多个term,term是最基本的单元,每个field可以保存自己的词向量,用来计算搜索相似度

按照数据的维度整个Lucene把需要处理的数据分为这么几类

  1. PostingList,倒排表,也就是term->[doc1, doc3, doc5]这种倒排索引数据
  2. BlockTree, 从term和PostingList的映射关系,这种映射一般都用FST这种数据结构来表示,这种数据结构其实是一种树形结构,类似于Tire树,所以Lucene这里就叫BlockTree, 其实我更习惯叫它TermDict。
  3. StoredField一般类型的field原始数据存储
  4. DocValue 键值数据,这种数据主要用于数值、日期类型的field,是用来加速对字段的排序、筛选的,列式存储。
  5. TermVector词向量信息,主要记一个不同term的全局出现频率等信息,用于score,如搜索的str会被分为一个个term,然后会被转为指定维度的向量,存储文档维护索引会根据当前文档、所有文档中term出现的频率以得到一个当前term的权重创建一个对应的指定维度的向量,然后就计算查询相关性score。
  6. Norms用来存储Normalisation信息, 比如给某些field加权之类的。
  7. PointValue 用来加速 range Query的信息。

一个段索引维护的数据,Lucene9_9_0版本https://lucene.apache.org/core/9_9_0/core/org/apache/lucene/codecs/lucene99/package-summary.html#package.description

  • Segment info. This contains metadata about a segment, such as the number of documents, what files it uses, and information about how the segment is sorted。其中包含有关片段的元数据,例如文档数量、它使用的文件以及有关片段排序方式的信息
  • Field names. This contains metadata about the set of named fields used in the index.包含文档fields的元数据以及名称。
  • Stored Field values. This contains, for each document, a list of attribute-value pairs, where the attributes are field names. These are used to store auxiliary information about the document, such as its title, url, or an identifier to access a database. The set of stored fields are what is returned for each hit when searching. This is keyed by document number.以文档ID作为key,存储当前文档的fields键值对。
  • Term dictionary. A dictionary containing all of the terms used in all of the indexed fields of all of the documents. The dictionary also contains the number of documents which contain the term, and pointers to the term’s frequency and proximity data.包含所有文档的所有索引字段中使用的所有term的字典。该词典还包含包含该term的文档数量,以及指向该术语的频率和邻近数据的指针。
  • Term Frequency data. For each term in the dictionary, the numbers of all the documents that contain that term, and the frequency of the term in that document, unless frequencies are omitted (IndexOptions.DOCS)。term在当前文档出现的频率以及在全部文档出现的频率,主要用于score得分,比如term在当前文档出现的频率最高,在所有文档出现的频率最低,那么搜索该term在该文档中搜索得分高。
  • Term Proximity data. For each term in the dictionary, the positions that the term occurs in each document. Note that this will not exist if all fields in all documents omit position data。term出现在所有文档的位置,可省略。
  • Normalization factors. For each field in each document, a value is stored that is multiplied into the score for hits on that field.计算相关性score的时候可为某些field字段乘以一个系数。
  • Term Vectors. For each field in each document, the term vector (sometimes called document vector) may be stored. A term vector consists of term text and term frequency. To add Term Vectors to your index see the Field constructors。每一个文档的每一个field会有一个term向量,主要根据term出现的频率计算出来,用于搜索的score分值计算。
    • TextField: Reader or String indexed for full-text search。用于全文搜索。
    • StringField: String indexed verbatim as a single token
    • IntPoint: int indexed for exact/range queries.
    • LongPoint: long indexed for exact/range queries.
    • FloatPoint: float indexed for exact/range queries.
    • DoublePoint: double indexed for exact/range queries.
    • SortedDocValuesField: byte[] indexed column-wise for sorting/faceting,按列索引,用于排序
    • SortedSetDocValuesField: SortedSet<byte[]> indexed column-wise for sorting/faceting
    • NumericDocValuesField: long indexed column-wise for sorting/faceting
    • SortedNumericDocValuesField: SortedSet indexed column-wise for sorting/faceting
    • StoredField: Stored-only value for retrieving in summary results。仅存储值。
  • Per-document values. Like stored values, these are also keyed by document number, but are generally intended to be loaded into main memory for fast access. Whereas stored values are generally intended for summary results from searches, per-document values are useful for things like scoring factors.类似StoreField,可以更快加载到内存访问,用于搜索的摘要结果,但是每个文档的值对于评分因素有很大的影响。
  • Live documents. An optional file indicating which documents are live.一个可选文件,指定哪些文档是实时的。主要用于段数据删除时候,在段外部维护一个状态记录段的最新状态。
  • Point values. Optional pair of files, recording dimensionally indexed fields, to enable fast numeric range filtering and large numeric values like BigInteger and BigDecimal (1D) and geographic shape intersection (2D, 3D).可选的一对文件,记录维度索引字段,以启用快速数值范围过滤和大数值,例如 BigInteger 和 BigDecimal (1D) 以及地理形状交集(2D、3D)。
  • Vector values. The vector format stores numeric vectors in a format optimized for random access and computation, supporting high-dimensional nearest-neighbor search.

按照数据存储的方向维度可以分为

  • 一般存储形式:按层次保存了从索引,一直到词的包含关系:索引(Index) –> 段(segment) –> 文档 (Document) –> 域(Field) –> 词(Term) ,层次结构,则每个层次都保存了本层次的信息以及下一层次的元信息。如StoredFileld、DocValue存储形式。
  • 反向存储形式:如倒排索引(PostingList + BlockTree)数据存储形式。

2、Lucene存储文件

一个索引相关的存储文件对应一个文件夹,一个段的所有文件都具有相同的名称和不同的扩展名。扩展名对应于下面描述的不同文件格式。当使用复合文件格式时(小段的默认格式),这些文件(段信息文件、锁定文件和文件夹文档文件除外)将折叠为单个.cfs文件。

  • Segments info:多个段文件名永远不会重复使用。也就是说,当任何文件保存到目录时, 以前从未使用过的文件名。这是使用简单的生成方法实现的。比如说, 第一个段文件是segments_1,然后是segments_2,依此类推。生成是连续的长 以字母数字(以36为基数)形式表示的整数。主要保存段的元信息,segments_N 保存了此索引包含多少个段,每个段包含多少篇文档,实际的数据信息保存在field和词中的。
  • Write.lock:写锁默认存储在索引目录中,名为“write.lock”。如果锁目录与索引目录不同,则写锁将被命名为“XXXX-write.lock”,其中“”是从索引目录的完整路径导出的唯一前缀。如果存在此文件,则表示编写者正在修改索引(添加或删除文档)。这个锁文件确保一次只有一个writer修改索引。
  • Fields、Field Index 、Field Data:This is keyed by document number.也就是上面说的一般存储形式,保存了此段包含了多少个field,每个field的名称及索引方式以及数据
  • Term Vector Index、Term Vector Data:当你将字段设置为存储Term Vector时,Lucene会提取出该字段中每个词项的相关信息,并将其存储到倒排索引中。这样可以在搜索时不仅找到包含关键词的文档,还能得知每个关键词在文档中的频率和位置。因为不仅要根据倒排索引找到文档ID,还需要计算文档的相关性得分,会存储当前文档全部term的频率、位置信息,为了下一步也就是根据文档内全部的term的频率信息计算下面的vector value。
  • Vector values:根据每个文档的所有term vector data数据,为每个文档计算出一个指定的相关性vector values,然后在跟query vevtor计算相关性score。

企业微信截图_8914cb9a-4d36-4b25-b5b0-f6fcb58a9e92.png

3、Lucene数据存储

ps:学习分析Lucene版本为9_9_0

3.1、StoredField

In Lucene, fields may be stored, in which case their text is stored in the index literally, in a non-inverted manner. Fields that are inverted are called indexed. A field may be both stored and indexed.

保存字段属性信息的,过程主要关注各数据类型是如何存储的? 最终写入索引是如何压缩的?Lucene的field数据类型有下面几大类

  • int
  • long
  • Float
  • Double
  • String
  • bytes
3.1.1、int

// TODO

3.1.2、long
3.1.3、Float
3.1.4、Double
3.1.5、String
3.1.6、bytes

3.2、DocValue

用于倒排查找的数据,加速筛选和排序的,主要关注

  • DocValue 的类型有哪些?SortedNumericDocValue?SortedSet?应用场景等。
  • DocValue是如何存储的?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现el-table操作列点击弹出echarts

代码&#xff1a; <el-table-column :width"90"><template #default"scope"><el-popover placement"left-end" width"550" trigger"click"><div><div style"font-size: 18px; margin-left…

Harmony4.0鸿蒙应用开发初识+实践小案例

Harmony4.0鸿蒙应用开发初识实践小案例 一、华为的“18N”产品战略 在华为HarmonyOS及全场景新品发布会上&#xff0c;华为介绍了华为“18N”三圈层全场景智慧生态解决方案&#xff0c;从而打造面向未来的全新生态&#xff0c;其中&#xff0c;1指的是手机&#xff0c;8指的是…

Python Django 连接 PostgreSQL 操作实例

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python Django 连接 PostgreSQL 操作实例&#xff0c;全文3500字&#xff0c;阅读大约10分钟 在Web开发中&#xff0c;使用Django连接到PostgreSQL数据库是一种常见的选择。…

云计算:Vmware 安装 FreeNAS

目录 一、实验 1.Vmware 安装 FreeNAS 2.配置Web界面 二、问题 1.iSCSI如何限定名称 2.LUN和LVM的区别 一、实验 1.Vmware 安装 FreeNAS &#xff08;1&#xff09;环境准备 VMware Workstation 17 FreeNAS相关安装部署镜像: 官网地址&#xff1a; https://download…

磁力计LIS2MDL开发(3)----九轴姿态解算

磁力计LIS2MDL开发.3--九轴姿态解算 概述视频教学样品申请完整代码下载使用硬件欧拉角万向节死锁四元数法姿态解算双环PI控制器偏航角陀螺仪解析代码 概述 LIS2MDL 包含三轴磁力计。 lsm6ds3trc包含三轴陀螺仪与三轴加速度计。 姿态有多种数学表示方式&#xff0c;常见的是四元…

手机上的python怎么运行,python在手机上怎么运行

大家好&#xff0c;本文将围绕python程序如何在手机端运行展开说明&#xff0c;python程序如何在手机上运行是一个很多人都想弄明白的事情&#xff0c;想搞清楚手机上的python怎么运行需要先了解以下几个事情。 如何用手机编程Python&#xff1f; 1.QPython3&#xff1a;这是一…

Vue 自定义搜索输入框SearchInput

效果如下&#xff1a; 组件代码 <template><div class"search-input flex flex-space-between flex-center-cz"><input type"text" v-model"value" :ref"inpuName" :placeholder"placeholder" keyup.enter&…

MySQL日志管理,备份与恢复

备份的主要目的是灾难恢复&#xff0c;备份还可以测试应用、回滚数据修改、查询历史数据、审计等。 而备份、恢复中&#xff0c;日志起到了很重要的作用 MySQL日志管理是数据库管理中的一个重要方面&#xff0c;它可以用于诊断问题、监控性能、进行故障恢复等。MySQL主要有几种…

VSCode 常用的快捷键和技巧系列(2)

一、如何让VSCode工程树显示图标 第一步&#xff1a;安装 快捷键 CtrlP &#xff0c;输入 ext install vscode-icons &#xff0c;然后点击安装插件 第二步&#xff1a;配置 安装成功后&#xff0c;点击Reload重新加载。 然后配置&#xff0c;当前图标使用VsCode-Icons Go…

1264. 动态求连续区间和(树状数组---某个位置加上一个数/求在线(动态)前缀和/蓝桥杯)

题目&#xff1a; 输入样例&#xff1a; 10 5 1 2 3 4 5 6 7 8 9 10 1 1 5 0 1 3 0 4 8 1 7 5 0 4 8输出样例&#xff1a; 11 30 35 树状数组&#xff1a; 代码&#xff1a; #include<cstdio> #include<iostream> using namespace std;const int N100010; int n,…

【Python从入门到进阶】44、Scrapy的基本介绍和安装

接上篇《43.验证码识别工具结合requests的使用》 上一篇我们学习了如何使用验证码识别工具进行登录验证的自动识别。本篇我们开启一个新的章节&#xff0c;来学习一下快速、高层次的屏幕抓取和web抓取框架Scrapy。 一、Scrapy框架的背景和特点 Scrapy框架是一个为了爬取网站数…

Qt/C++音视频开发60-坐标拾取/按下鼠标获取矩形区域/转换到视频源真实坐标

一、前言 通过在通道画面上拾取鼠标按下的坐标&#xff0c;然后鼠标移动&#xff0c;直到松开&#xff0c;根据松开的坐标和按下的坐标&#xff0c;绘制一个矩形区域&#xff0c;作为热点或者需要电子放大的区域&#xff0c;拿到这个坐标区域&#xff0c;用途非常多&#xff0…

linux应急响应基础和常用命令

linux应急响应 linux应急响应基础和常用命令基于linux系统本身进行应急响应。 系统基础信息获取 获取linux服务器基本信息 命令&#xff1a; uname -a内存cpu信息 cat /proc/cpuinfo cat /proc/meminfo lscpu free -m lsmod #查看载入的模块信息进程查看 动态进程查看 …

将mjpg格式数转化成opencv Mat格式

该博客可以解决如下两个问题&#xff1a; 1、将mjpg格式数据转化成opencv Mat格式 2、v4l2_buffer 格式获取的mjpg格式数据转换成Mat格式。 要将 MJPEG 格式的数据转换为 OpenCV 的 Mat 格式&#xff0c;您可以使用 imdecode 函数。imdecode 函数可以将图像数据解码为 Mat 对象…

CCNP课程实验-OSPF-CFG

目录 实验条件网络拓朴需求 配置实现基础配置1. 配置所有设备的IP地址 实现目标1. 要求按照下列标准配置一个OSPF网络。 路由协议采用OSPF&#xff0c;进程ID为89 &#xff0c;RID为loopback0地址。3. R4/R5/R6相连的三个站点链路OSPF网络类型配置成广播型&#xff0c;其中R5路…

电子电器架构( E/E) 演化 —— 高速 大算力

电子电器架构( E/E) 演化 —— 高速 & 大算力 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要…

ELK(八)—Metricbeat部署

目录 介绍修改配置文件启动 Modulenginx开启状态查询配置Nginx module查看是否配置成功 介绍 Metricbeat 是一个轻量级的开源度量数据收集器&#xff0c;用于监控系统和服务。它由 Elastic 公司开发&#xff0c;并作为 Elastic Stack&#xff08;Elasticsearch、Logstash、Kiba…

【机器学习】梯度下降法:从底层手写实现线性回归

【机器学习】Building-Linear-Regression-from-Scratch 线性回归 Linear Regression0. 数据的导入与相关预处理0.工具函数1. 批量梯度下降法 Batch Gradient Descent2. 小批量梯度下降法 Mini Batch Gradient Descent&#xff08;在批量方面进行了改进&#xff09;3. 自适应梯度…

什么同源策略?

同源 同源指的是URL有相同的协议、主机名和端口号。 同源策略 同源策略指的是浏览器提供的安全功能&#xff0c;非同源的RUL之间不能进行资源交互 跨域 两个非同源之间要进行资源交互就是跨域。 浏览器对跨域请求的拦截 浏览器是允许跨域请求的&#xff0c;但是请求返回…

spring-kakfa依赖管理之org/springframework/kafka/listener/CommonErrorHandler错误

问题&#xff1a; 整个项目使用spring-boot2.6.8版本&#xff0c;使用gradle构建&#xff0c;在common模块指定了implementation org.springframework.kafka:spring-kafka:2.6.8’这个工程也都能运行&#xff08;这正常发送kafka消息和接收消息&#xff09;&#xff0c;但是执行…