原文地址: https://www.elastic.co/guide/cn/elasticsearch/guide/current/docvalues-intro.html, 版权归 www.elastic.co 所有
英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/docvalues-intro.html
英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/docvalues-intro.html
请注意:
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
Doc Values 介绍edit
本章的最后一个话题是关于 Elasticsearch
内部的一些运行情况。在这里我们先不介绍新的知识点,所以我们应该意识到,Doc Values
是我们需要反复提到的一个重要话题。
当你对一个字段进行排序时,Elasticsearch
需要访问每个匹配到的文档得到相关的值。倒排索引的检索性能是非常快的,但是在字段值排序时却不是理想的结构。
- 在搜索的时候,我们能通过搜索关键词快速得到结果集。
-
当排序的时候,我们需要倒排索引里面某个字段值的集合。换句话说,我们需要
转置
倒排索引。
转置
结构在其他系统中经常被称作 列存储
。实质上,它将所有单字段的值存储在单数据列中,这使得对其进行操作是十分高效的,例如排序。
在 Elasticsearch
中,Doc Values
就是一种列式存储结构,默认情况下每个字段的 Doc Values
都是激活的,Doc Values
是在索引时创建的,当字段索引时,Elasticsearch
为了能够快速检索,会把字段的值加入倒排索引中,同时它也会存储该字段的 Doc Values
。
Elasticsearch
中的 Doc Values
常被应用到以下场景:
- 对一个字段进行排序
- 对一个字段进行聚合
- 某些过滤,比如地理位置过滤
- 某些与字段相关的脚本计算
因为文档值被序列化到磁盘,我们可以依靠操作系统的帮助来快速访问。当 working set
远小于节点的可用内存,系统会自动将所有的文档值保存在内存中,使得其读写十分高速;
当其远大于可用内存,操作系统会自动把 Doc Values
加载到系统的页缓存中,从而避免了 jvm
堆内存溢出异常。
我们稍后会深入讨论 Doc Values
。现在所有你需要知道的是排序发生在索引时建立的平行数据结构中。