大数据-184 Elasticsearch - 原理剖析 - DocValues 机制原理 压缩与禁用

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(已更完)
  • Elasticsearch(正在更新…)

章节内容

上节我们完成了如下的内容:

  • Elasticsearch 并发冲突处理机制剖析
  • Elasticsearch 分布式数据一致性剖析

在这里插入图片描述

DocValues 机制

Doc Values 是一种以列式存储的索引机制,用于在检索时优化磁盘读取操作。与反向索引不同,反向索引是基于倒排表的结构,主要用于快速查找文档中包含某个词的情况,而 Doc Values 则是用于在不加载整个文档的情况下高效获取某个字段的值,适用于以下场景:

  • 排序:当根据某个字段进行排序时,Doc Values 提供了高效的读取机制。
  • 聚合:在执行类似于 terms、sum、average 等聚合操作时,Doc Values 的列存储可以快速读取并计算相关值。
  • 过滤:当对文档字段进行范围过滤等操作时,Doc Values 也能加速这些查询。

为什么要有Doc Values

Elasticsearch之所以搜索这么迅速,归功于它的倒排索引设计,然后它也不是万能的,倒排索引的检索性能是非常快的,但是在字段排序时却不是理想的结构:

Term Doc_1 Doc_2
-------------------------
quick  |   | X
the    | X |
brown  | X | X
dog    | X |
dogs   |   | X
fox    | X |
foxes  |   | X
in     |   | X
jumped | X |
lazy   | X | X
leap   |   | X
over   | X | X
summer |   | X
the    | X |
------------------------

如上面的内容中可以看出,它只有词对应doc,但是并不知道每一个doc中的内容,那么如果想排序的话每一个doc都去获取一次文档内容岂不是非常耗时?DocValues的出现使得这个问题迎刃而解。
字段的 doc_values 属性有两个值,true、false,默认是true,即开启。
当 doc_values 为 false 时,无法基于该字段排序、聚合、在脚本中访问字段值。
当 doc_values 为 true 时,ES会增加一个相应的正排索引,这增加的磁盘占用,也会导致索引数据速度慢一些。

Doc Values 是列式存储的,这意味着每个字段值都以列的形式存储在磁盘中,而不是像原始文档那样存储在行中。这种方式有助于优化数据的读取,因为在执行排序或聚合时,Elasticsearch 只需访问与操作相关的字段,而不需要加载整个文档。

每个文档的字段值在索引时被预处理,并以压缩的形式存储为 Doc Values,这些值会以内存映射文件(memory-mapped file)的方式加载到内存中,以便进行快速读取。

Doc Values举例

创建一个索引:

PUT /person
{
  "mappings" : {
    "properties" : {
      "name" : {
        "type" : "keyword",
        "doc_values": true
      },
      "age" : {
        "type" : "integer",
        "doc_values": false
      }
    }
  }
}

写入相对应的数据:

POST _bulk
{ "index" : { "_index" : "person", "_id" : "1" } }
{ "name" : "明明", "age": 22 }
{ "index" : { "_index" : "person", "_id" : "2" } }
{ "name" : "丽丽", "age": 18 }
{ "index" : { "_index" : "person", "_id" : "3" } }
{ "name" : "媛媛", "age": 19 }

执行结果如下图所示:
在这里插入图片描述
进行全量查询,确认一下数据的情况:

POST /person/_search
{
  "query": {
    "match_all": {}
  },
  "sort" : [
    {
      "name": {
        "order": "desc"
      }
    }
  ]
}

执行结果如下图所示:
在这里插入图片描述

什么是Doc Values

Doc Values 通过转置倒排索引和正排索引两者间的关系来解决这个问题,倒排索引将词项映射到包含它的文档:

Doc Terms
-----------------------------------------------------------------
Doc_1 | brown, dog, fox, jumped, lazy, over, quick, the
Doc_2 | brown, dogs, foxes, in, lazy, leap, over, quick, summer
Doc_3 | dog, dogs, fox, jumped, over, quick, the
-----------------------------------------------------------------

当数据被转置后,想要收集到每个文档行,获取所有的词项就非常简单了。

深入理解ES Doc Values

DocValues是索引时与倒排索引同时生成,也就是说DocValues和倒排索引一样,基于Segment生成并且是不可变的,同时DocValues和倒排索引一样序列化到磁盘,这样对性能和扩展性有很大帮助。
DocValues通过序列化把数据结构持久化到磁盘,我们可以充分利用操作系统的内存,而不是JVM的Heap,当workingset远小于系统的可用内存,系统会自动将DocValues保存在内存中,使得读写十分高速。
不过当远大于可用内存时,操作系统会自动把DocValues写入磁盘。很显然,这样性能会比内存要差很多,但是它不会局限于服务器的内存大小。

DocValues 压缩

从广义来说,DocValues本质上是一个序列化的列式存储,这个结构非常适用于聚合、排序、脚本等操作。而且,这种存储方式非常的便于压缩,特别是数字类型,这样可以减少磁盘空间并且提高访问速度。
下面我们看一组数字类型的DocValues:

Doc Terms
-----------------------------------------------------------------
Doc_1 | 100
Doc_2 | 1000
Doc_3 | 1500
Doc_4 | 1200
Doc_5 | 300
Doc_6 | 1900
Doc_7 | 4200
-----------------------------------------------------------------

你会注意到这里每个数字都是100的倍数,DocValues会检测一个段里面的所有数值,并使用一个最大公约数,方便做进一步的数据压缩,我们可以对每个数字都除以100,然后得到:[1,10,15,12,3,19,42]。现在这些数字变小了,只需要很少的位就可以存储下,也减少了磁盘存放的大小。

DocValues在压缩过程中使用如下技巧,它会依次检测以下压缩模式:

  • 如果所有的数值各不相同(或缺失),设置一个标记并记录这些值
  • 如果这些值小于256,将使用一个简单的编码表
  • 如果这些值大于256,检测是否存在一个最大公约数
  • 如果没有存在最大公约数,从最小的数值开始,统一计算偏移量进行编码
    当然如果存储String类型,其一样可以通过顺序表对String类型进行数字编码,然后再把数字类型构建DocValues。

禁用 Doc Values

DocValues 默认对所有字段启动,除了 analyzed strings。也就是说所有的数字、地理坐标、日期、IP和不分析(not_analyzed)字符类型都会默认开启。
analyzed strings暂时还不能使用 DocValues,是因为经过分析以后得文本会生成大量的Token,这样非常影响性能。
虽然DocValues非常好用,但是如果你存储的数据确实不需要这个特性,就不如禁用它,这样不仅节省磁盘空间,也许会提升索引的速度。
要禁用DocValues,在字段的映射mapping设置doc_values:false即可。例如,这里我们创建了一个新的索引,字段 session_id禁用了DocValues:

DELETE /my_index
{
  "mappings": {
    "properties": {
      "session_id": {
        "type": "keyword",
        "doc_values": false
      }
    }
  }
}

通过设置 doc_values:false,这个字段将不能被用于聚合、排序以及脚本操作

带来的优势

  • 减少内存使用:由于 Doc Values 将字段值存储在磁盘上并在需要时读取,因此相比内存中保持字段值的方式(例如 fielddata),它极大地减少了内存的使用。
  • 高效的磁盘读取:Doc Values 的列式存储意味着在执行排序或聚合操作时,Elasticsearch 可以只加载所需的字段值,而不必加载整个文档。
  • 提高排序和聚合的性能:对于经常需要排序或聚合的字段,Doc Values 可以显著提高性能,因为它优化了读取路径。

使用场景

  • 排序:例如,用户需要根据时间戳排序查询结果,Doc Values 会提供优化的列式存储,直接从磁盘读取时间戳的值进行排序,而不需要加载整个文档。
  • 聚合:在执行例如统计某个字段的平均值、最大值或分布情况时,Doc Values 可以极大地提高查询的响应速度,因为只需读取相关字段即可。
  • 范围查询:例如查找价格在一定范围内的文档时,Doc Values 允许快速扫描价格字段而不涉及文档的其他内容。

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

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

相关文章

数字后端零基础入门系列 | Innovus零基础LAB学习Day4

Module 10 利用Global Router来分析设计是否可绕通 LAB10-1 跑一个placement 本章节目的是load进一个floorplan,跑通一个placement并完成post-placement的timing优化 导入设计和floorplan 这步之前的lab已经做过了,大家再按照下面的步骤再练习巩固下…

信息安全工程师(62)网络蠕虫分析与防护

网络蠕虫分析 网络蠕虫是一种智能化、自动化,综合了网络攻击、密码学和计算机病毒技术的恶意程序或代码,它无须计算机使用者干预即可运行。这种蠕虫能够扫描和攻击网络上存在系统漏洞的节点主机,并通过局域网或国际互联网从一个节点传播到另一…

【UE5】通过程序化网格体组件实现剖切功能

效果 步骤 1. 新建两个Actor类蓝图,分别命名为“BP_CutActor”、“BP_CutPlane”,分别表示被剖切的网格体和剖切的片面。 2. 打开“BP_CutActor”(被剖切的网格体),添加静态网格体组件、程序化网格体组件,…

(三)第一个Qt程序“Qt版本的HelloWorld”

一、随记 我们在学习编程语言的时候,各种讲解编程语言的书籍中通常都会以一个非常经典的“HelloWorld”程序展开详细讲解。程序虽然简短,但是“麻雀虽小,五脏俱全”,但是却非常适合用来熟悉程序结构、规范,快速形成对编…

原型模式和建造模式的区别

原型模式(Prototype Pattern)和建造者模式(Builder Pattern)虽然都是创建型设计模式,但它们的应用场景和实现方式有着显著的区别。以下是二者的详细对比: 1. 意图和应用场景 原型模式: 意图&a…

【论文阅读】2022 TChecker Precise Static Inter-Procedural Analysis for Detecting

总览 “TChecker: Precise Static Inter - Procedural Analysis for Detecting Taint - Style Vulnerabilities in PHP Applications” 由香港中文大学的 Changhua Luo、Penghui Li 和 Wei Meng 撰写。论文介绍了 TChecker 工具,用于检测 PHP 应用中的污点式漏洞&am…

【Linux】为什么环境变量具有全局性?共享?写时拷贝优化?

环境变量表具有全局性的原因: 环境变量表之所以具有全局性的特征,主要是因为它们是在进程上下文中维护的,并且在大多数操作系统中,当一个进程创建另一个进程(即父进程创建子进程)时,子进程会继承…

动态路由:RIP实验

1.划分IP 2.配置环回 3.接口配置IP地址 4.进入RIP中,关闭手工汇总,选择版本号,宣告 5.ping命令查看是否全网通 6.在R3上配置缺省路由 [R3-rip-1]default-route originate 在边界路由器上下发缺省 7.为了安全配置手工认证 [R1-Gigab…

qt QVariant详解

QVariant是Qt框架中一个功能强大的变体类,它提供了一种通用的方式来存储Qt对象及其他类的值,能够以类似于指针的方式存储任意类型的值。 一、 主要特性 通用性:QVariant可以存储几乎所有数据类型,包括基本数据类型(如…

刷题小记9:回溯

回溯算法模板: void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理…

html+vue实现动态复杂table

1、效果 2、代码 <div style"overflow: scroll; width: 100%;height: calc(100% - 80px);"><table class"table table-bordered" style"width: auto;table-layout: fixed;"><thead style"position: sticky;top: -1px;z-inde…

【C++干货篇】——类和对象的魅力(四)

【C干货篇】——类和对象的魅力&#xff08;四&#xff09; 1.取地址运算符的重载 1.1const 成员函数 将const修饰的成员函数称之为const成员函数&#xff0c;const修饰成员函数放到成员函数参数列表的后面。const实际修饰该成员函数隐含的this指针&#xff08;this指向的对…

IDEA如何查看所有的断点(Breakpoints)并关闭

前言 我们在使用IDEA开发Java应用时&#xff0c;基本上都需要进行打断点的操作&#xff0c;这方便我们排查BUG&#xff0c;也方便我们查看设计的是否正确。 不过有时候&#xff0c;我们不希望进入断点&#xff0c;这时候除了点击断点关闭外&#xff0c;有没有更快速的方便关闭…

深入浅出剖析重量级文生图模型Flux.1

24年8月&#xff0c;Flux.1的发布又一次火爆整个AI绘图领域&#xff0c; 号称AI文生图的“新标杆”&#xff0c;刷新AI图像领域的新格局。 Flux是一款由Black Forest Labs开发的尖端AI图像生成工具&#xff0c;旨在通过先进的技术将文本提示转化为高质量的图像。Flux AI支持多…

利用 OBS 推送 WEBRTC 流到 smart rtmpd

webrtc whip 推流 & whep 拉流简介 RFC 定义 通用的 webrtc 对于 SDP 协议的交换已经有对应的 RFC 草案出炉了。这就是 WHIP( push stream ) & WHEP ( pull stream ) . WHIP RFC Link: https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html WHEP RFC Link:…

总分441数一149专137东南大学820信号数电考研经验电子信息与通信工程电路原920专业基础综合,真题,大纲,参考书。

一. 写在前面的话 本人是23年考生&#xff0c;本科就读于西电电子信息工程&#xff0c;以441分总分&#xff08;数学一149&#xff0c;英语83&#xff0c;专业课820&#xff08;原920信号和数电专业基础综合&#xff09;137&#xff0c;政治73&#xff09;考上东南信院电路与系…

虚拟机(VMwara Workstation17)保姆级别的安装(附软件获取途径)

文章目录 一、虚拟机的作用二、虚拟机的获取三、虚拟机的安装步骤四、总结 一、虚拟机的作用 压根不需要给自己的电脑重装系统&#xff0c;就可以使用Linux系统。简单来说就是虚拟出一个计算机&#xff0c;安装Linux系统&#xff0c;便于学习和工作 关于虚拟机的介绍&#xf…

初识Linux · 预备文件系统

目录 前言&#xff1a; 看看物理磁盘 了解磁盘的存储结构 对磁盘进行逻辑抽象 前言&#xff1a; 我们在上文探讨的问题都是基于文件是被打开的情况&#xff0c;那么对于文件没有被打开的情况&#xff0c;我们是没有探讨过的&#xff0c;而本文作为文件系统的预备知识&…

多ip访问多网站

1.前提配置 关防火墙 关selinux 2.安装web服务程序nginx 3.当前主机添加多地址&#xff08;ip a&#xff09; 4.自定义nginx配置文件通过多地址区分多网站 /etc/nginx/conf.d/test_ip.conf server { #标记为一个虚拟主机} 5.根据配置在主机创建数据文件 6.重启服务加载配…

【ROS2】构建导航工程

1、ROS小车组成 ROS小车由三大件组成:运动底盘、ROS主控、导航传感器。 1.1 运动底盘 运动底盘的硬件由车轮、电机(带编码器)、电机驱动器、STM32控制器、电池等组成。 涉及的知识点主要为:STM32单片机程序、机器人运动学分析 1)STM32单片机程序 单片机程序框架如下:…