题记
最近知识星球里几个问题都问到了 doc values、store field、fielddata 等的概念。
问题1:”群主有介绍 doc value, field data, store fields 比较好的文章么?一直感觉有点模糊“
问题2:“请教下星主关于ES存储相关的问题, 一个文档有如下几个地方可能会存储:
倒排索引。
Source 字段。
store 存储(如果开启)
doc_values。
不知道我理解的是否正确?
如果这几个地方都存储, 那是不是可以理解为数据大致会膨胀了4倍?
死磕 Elasticsearch 知识星球(http://t.cn/RmwM3N9)
非常有必要好好梳理一下,于是就有了这篇文章。
Elasticsearch 数据结构的理解和合理使用,对深入理解 Elasticsearch大有裨益!
1、数据存储认知前提
正如 Elastic 官方文档所说:
Elasticsearch 特点之一是:分布式文档存储。
Elasticsearch不会将信息存储为类似列数据库的行(row),而是存储为已序列化为JSON文档的复杂数据结构。
当集群中有多个Elasticsearch节点时,存储的文档会分布在整个集群中,并且可以从任何节点立即访问。
存储文档后,将在1秒钟内(默认刷新频率为1s)几乎实时地对其进行索引和完全搜索。
如何做到快速索引和全文检索的呢?
Elasticsearch使用倒排索引的数据结构,该结构支持非常快速的全文本搜索。
倒排索引列出了出现在任何文档中的每个唯一单词,并标识了每个单词出现的所有文档。
索引可以认为是文档的优化集合,每个文档都是字段的集合,这些字段是包含数据的键值对。
默认情况下,Elasticsearch 对每个字段中的所有数据建立索引,并且每个索引字段都具有专用的优化数据结构。
例如,文本字段存储在倒排索引中,数字字段和地理字段存储在BKD树中。
数据类型 | 数据结构 |
---|---|
text/keyword | 倒排索引 |
数字/地理位置 | BKD树 |
不同字段具有属于自己字段类型的特定优化数据结构,并具备快速响应返回搜索结果的能力使得 Elasticsearch 搜索飞快!
1、Inverted Index 倒排索引
1.1 倒排索引定义
面对海量内容,如何快速的找到包含用户查询词的内容,倒排索引扮演了关键角色。
倒排索引是单词到文档映射关系的最佳实现形式。
下图是:书的末页的索引结构,展示了核心关键词与书页码的对应关系。
试想一下,没有这个索引页,根据关键词从全书查找有多慢,就能直观体会出索引的妙处!
1.2 倒排索引示例
拿官方文档的示例:
假设我们有两个文档,每个文档的 content 域包含如下内容:
- 1、The quick brown fox jumped over the lazy dog
- 2、Quick brown foxes leap over la