深入理解 ElasticSearch Doc Values
2018-01-18 00:31
309 查看
前言
最近在使用ElasticSearch,于是简单看了一下内部实现,看到
Doc Values的地方发现网上的翻译很是拗口,于是就有了下面的这篇文章。
为什么要有 Doc Values
我们都知道ElasticSearch之所以搜索这么快速,归功于他的
倒排索引的设计,然而它也不是万能的,倒排索引的检索性能是非常快的,但是在字段值排序时却不是理想的结构。下面是一个简单的
倒排索引的结构
如上表便可以看出,他只有词对应的
doc,但是并不知道每一个
doc中的内容,那么如果想要排序的话每一个
doc都去获取一次文档内容岂不非常耗时?
Doc Values的出现使得这个问题迎刃而解。
Doc Values 是什么
其实大部分NoSQL在创建多个索引的时候也采用这种方式,就是再使用另一种方式存储一份文本,使得可以增强搜索。
Doc values通过转置两者间的关系来解决这个问题。倒排索引将词项映射到包含它们的文档,
Doc values将文档映射到它们包含的词项:当数据被转置之后,想要收集到每个文档行,获取所有的词项就非常简单了。所以搜索使用倒排索引查找文档,聚合操作收集和聚合
Doc Values里的数据,这就是
ElasticSearch。
深入理解 ElasticSearch Doc Values
Doc Values是在索引时与倒排索引同时生成。也就是说
Doc Values和
倒排索引一样,基于
Segement生成并且是不可变的。同时
Doc Values和
倒排索引一样序列化到磁盘,这样对性能和扩展性有很大帮助。
Doc Values通过序列化把数据结构持久化到磁盘,我们可以充分利用操作系统的内存,而不是
JVM的
Heap。 当
working set远小于系统的可用内存,系统会自动将
Doc Values保存在内存中,使得其读写十分高速; 不过,当其远大于可用内存时,操作系统会自动把
Doc Values写入磁盘。很显然,这样性能会比在内存中差很多,但是它的大小就不再局限于服务器的内存了。如果是使用
JVM的
Heap来实现那么只能是因为
OutOfMemory导致程序崩溃了。
Doc Values 压缩
从广义来说,Doc Values本质上是一个序列化的 列式存储,这个结构非常适用于聚合、排序、脚本等操作。而且,这种存储方式也非常便于压缩,特别是数字类型。这样可以减少磁盘空间并且提高访问速度。下面来看一组数字类型的
Doc Values:
你会注意到这里每个数字都是 100 的倍数,
Doc Values会检测一个段里面的所有数值,并使用一个 最大公约数 ,方便做进一步的数据压缩。我们可以对每个数字都除以 100,然后得到:
[1,10,15,12,3,19,42]。现在这些数字变小了,只需要很少的位就可以存储下,也减少了磁盘存放的大小。
Doc Values在压缩过程中使用如下技巧。它会按依次检测以下压缩模式:如果所有的数值各不相同(或缺失),设置一个标记并记录这些值
如果这些值小于 256,将使用一个简单的编码表
如果这些值大于 256,检测是否存在一个最大公约数
如果没有存在最大公约数,从最小的数值开始,统一计算偏移量进行编码
当然如果存储
String类型,其一样可以通过顺序表对
String类型进行数字编码,然后再把数字类型构建
Doc Values。
禁用 Doc Values
Doc Values默认对所有字段启用,除了
analyzed strings。也就是说所有的数字、地理坐标、日期、IP 和不分析(
not_analyzed)字符类型都会默认开启。
analyzed strings暂时还不能使用
Doc Values,是因为经过分析以后的文本会生成大量的
Token,这样非常影响性能。虽然
Doc Values非常好用,但是如果你存储的数据确实不需要这个特性,就不如禁用他,这样不仅节省磁盘空间,也许会提升索引的速度。要禁用
Doc Values,在字段的映射(mapping)设置
doc_values: false即可。例如,这里我们创建了一个新的索引,字段
"session_id"禁用了
Doc Values:
通过设置
doc_values: false,这个字段将不能被用于聚合、排序以及脚本操作同样可以禁用倒排索引,使它不能被正常搜索,但是可以排序,例如:通过设置
doc_values: true和
index: no,我们得到一个只能被用于聚合/排序/脚本的字段。
总结
倒排索引和
Doc Values只是
ElasticSearch的冰山一角,如果有兴趣的同学可以做更深入的研究,本文只是笔者的学习笔记,希望对大家有帮助。
作者
本文作者麻酱,欢迎讨论,指正和转载,转载请注明出处。
原文地址:深入理解 ElasticSearch Doc Values
如果兴趣可以关注作者微信订阅号
相关文章推荐
- 深入理解ElasticSearch(二)索引
- elasticsearch核心知识--43.关于内核知识doc_value的理解
- 深入理解ElasticSearch(三)搜索
- 深入理解Magento – 第四章 – 模型和ORM基础.doc
- 深入理解Magento – 第六章 – 高级Magento模型.doc
- elasticsearch的Doc Values 和 Fielddata
- 深入理解ElasticSearch(六)排序与相关性
- Elasticsearch深入理解(一)
- 《深入理解Elasticsearch(原书第2版)》一第2章 查询DSL进阶
- 深入理解ElasticSearch(四)映射和分析
- 《深入理解Elasticsearch(原书第2版)》——第1章 Elasticsearch简介
- ElasticSearch 深入理解 三:集群部署设计
- ElasticSearch 2 (10) - 在ElasticSearch之下(深入理解Shard和Lucene Index)
- ElasticSearch 深入理解系列2 -集群,分布式特性
- 深入理解ElasticSearch(五)请求体查询
- ElasticSearch-深入理解系列4-文档(Document)
- 痛批BI基础篇_深入理解数据挖掘_报告.doc
- elasticsearch中的doc_values
- 深入理解Magento – 第三章 – Magento的布局(Layout),块(Block)和模板(Template).doc
- ELasticSearch 深入理解系列5 -索引、类型