Elasticsearch中数据是如何存储的?

使用Elasticsearch的时候,我们常常需要关注数据存储在Elasticsearch中的存储容量。下面,我们来了解一下Elasticsearch中的数据是如何存储。

一、Elasticsearch索引结构

Elasticsearch对外提供的是index的概念,可以类比为MySQL DB,用户查询是在index上完成的,每个index由若干个shard组成,以此来达到分布式可扩展的能力。比如下图是一个由10个shard组成的index。


二、lucene数据存储

下面了解一下lucene的基本概念。


1. lucene基本概念

  • segment : lucene内部的数据是由一个个segment组成的,写入lucene的数据并不直接落盘,而是先写在内存中,经过了refresh间隔,lucene才将该时间段写入的全部数据refresh成一个segment,segment多了之后会进行merge成更大的segment。lucene查询时会遍历每个segment完成。由于lucene 写入的数据是在内存中完成,所以写入效率非常高。但是也存在丢失数据的风险,所以Elasticsearch基于此现象实现了translog,只有在segment数据落盘后,Elasticsearch才会删除对应的translog。
  • doc : doc表示lucene中的一条记录。
  • field :field表示记录中的字段概念,一个doc由若干个field组成。
  • term :term是lucene中索引的最小单位,某个field对应的内容如果是全文检索类型,会将内容进行分词,分词的结果就是由term组成的。如果是不分词的字段,那么该字段的内容就是一个term。
  • 倒排索引(inverted index): lucene索引的通用叫法,即实现了term到doc list的映射。


对照上面的lucene文件表,进行简要归纳:

  • 存储原文_source的文件.fdt .fdm .fdx;
  • 存储倒排索引的文件.tim .tip .doc;
  • 用于聚合排序的列存文件.dvd .dvm;
  • 全文检索文件.pos .pay .nvd .nvm等;
  • 加载到内存中的文件有.fdx .tip .dvm;

其中.tip占用内存最大,而.fdt、.tim、.dvd文件占用磁盘最大。



分享到:


相關文章: