Elasticsearch 6中index/_stats与du -h统计大小差异疑问
为什么Elasticsearch存储大小和原始JSON文件差异这么大?
这完全是合理的,而且是Elasticsearch这类搜索引擎的正常特性——它的存储逻辑和本地原始JSON文件有本质区别,咱们来拆解下具体原因:
- 默认开启的数据压缩:Elasticsearch会自动对存储的数据进行高效压缩,尤其是核心的倒排索引部分。它默认使用LZ4压缩算法(也可以配置Deflate),原始JSON里大量重复的字段名、重复属性值都会被大幅压缩。你看3000条数据从12MB降到3.3MB,压缩比接近4:1,这在正常范围内。
- 倒排索引的结构优化:Elasticsearch不是直接存原始JSON,而是把数据转换成倒排索引来支持快速检索。这个过程会对数据做去重、编码优化——比如重复的字符串(字段名、重复的属性值)只存一次,用引用指向它们,不像原始JSON每条都重复写字段名,这省了不少空间。
- 元数据与存储格式的差异:本地JSON是纯文本,每条数据都是完整独立的结构,包含所有字段名和值。而Elasticsearch会把字段的元数据(类型、分词器设置等)单独存储,文档本身只存经过编码的字段值,避免了大量重复字段名的开销。
- 稀疏文档的优化处理:如果你的JSON文档有很多可选字段,Elasticsearch只会存储实际存在的字段;而原始JSON里哪怕字段为空,可能也会保留字段名占位,这也会进一步缩小存储体积。
拿你的数据例子来看:100条时差异还不算特别大,但数据量越大,这些优化的叠加效果就越明显,所以3000条时差异倍数更高,这完全符合预期。
如果想验证的话,你可以去Elasticsearch的数据目录(比如/var/lib/elasticsearch/data/nodes/0/indices/,具体路径看你的配置)下用du -h查看实际磁盘占用,会发现这个大小和/_stats返回的结果是接近的——毕竟/_stats统计的是Elasticsearch实际存储的数据大小,而你本地du看的是未经过任何优化的原始JSON文件,两者本来就没有可比性。
内容的提问来源于stack exchange,提问作者mizenetofa1989
相关产品推荐
相关产品推荐

