当前位置: 首页 > news >正文

ESDocValues机制

为什么要有 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 属性有两个值, truefalse。默认为 true ,即开启。当 doc_values fasle 时,无法基于该字段排序、聚合、在脚本中访问字段值。当 doc_values true 时,ES 会增加一个相应的正排索引,这增加的磁盘占用,也会导致索引数据速度慢一些

举例:

DELETE /person
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"}}
]
}
POST /person/_search
{
"query": {
"match_all": {}
},
"sort" : [
{"age": {"order": "desc"}}
]
}
POST /person/_search
{
"query": {
"match_all": {}
},
"size":0,
"aggs": {
"max_age": {
"max": {
"field": "age"
}
}
}
}

Doc Values 是什么

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

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
-----------------------------------------------------------------
当数据被转置之后,想要收集到每个文档行,获取所有的词项就非常简单了。所以搜索使用倒排索引查找文档,聚合 操作收集和聚合 DocValues 里的数据,这就是 ElasticSearch

Doc Values 压缩

从广义来说, 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] 。现在这些数字 变小了,只需要很少的位就可以存储下,也减少了磁盘存放的大小。


推荐阅读

Module 2:\u000BIntroduction to UML

技术总体方案设计思路

https://mp.weixin.qq.com/s?__biz=MzI5MzQ4NTQ4Mg==&mid=2247486289&idx=1&sn=fb9abd282ef30d49b169eb508bd5410a&scene=21&poc_token=HMWGkGijnx6m3qCvLZ71K24qmP071wi3_bxd9fGE

http://www.dtcms.com/a/314979.html

相关文章:

  • GEM_ 迈向通用LLM智能体训练新纪元
  • Java 后端 + JavaScript 前端 实现按钮级别权限控制的解决方案
  • HTTP、WebSocket、TCP、Kafka等通讯渠道对比详解
  • JavaScript案例(乘法答题游戏)
  • Claude Code六周回顾
  • 关键字 - 第一讲
  • 【Redis】安装Redis,通用命令
  • dubbo——远程服务调用
  • 华为OD机考2025C卷 - 分配土地 (Java Python JS C++ C )
  • 解决MySQL删除/var/lib/mysql下的所有文件后无法启动的问题
  • SpringBoot基础复习
  • SwiftUI ios开发中的 MVVM 架构深度解析与最佳实践
  • 为什么ping和dig(nslookup)返回地址不一样,两者的区别
  • ElfBoard技术贴|如何在【RK3588】ELF 2开发板中安装openCV4以及第三方库contrib
  • 腾讯混元3d模型360全景模式
  • Python 桌面时钟屏保程序
  • Dynamic Programming【DP】1
  • 【Linux】gdb cgdb — 基操
  • 广东省省考备考(第六十六天8.4)——判断推理(强化训练)
  • 竞品分析爬虫实现方案
  • Adobe Experience Manager (AEM) Assets|企业级数字资产管理平台(DAM)
  • 【DAB收音机】DAB服务跟随Service Follow功能介绍(一)
  • RAG常见问题与优化方法全解析|从新手到高手的实践指南
  • 【Spring】SpringBoot 自动配置,@ComponentScan、@Import、ImportSelector接口
  • 下载 | Windows Server 2025官方原版ISO映像!(7月更新、标准版、数据中心版、26100.4652)
  • Android工程命令行打包并自动生成签名Apk
  • MySQL 8.0源码编译安装
  • The Gang
  • 30天入门Python(基础篇)——第31天:标准库学习之re模块
  • 采集像列车:任务如何不脱轨、数据如何不漏采