注意:由于是重复数据,词法不具有通用性!文章价值不大!

摘自:https://segmentfault.com/a/1190000002695169

Doc Values 会压缩存储重复的内容。 给定这样一个简单的 mapping

mappings = {
'testdata': {
'_source': {'enabled': False},
'_all': {'enabled': False},
'properties': {
'name': {
'type': 'string',
'index': 'no',
'store': False,
'dynamic': 'strict',
'fielddata': {'format': 'doc_values'}
}
}
}
}

插入100万行随机的重复值

words = ['hello', 'world', 'there', 'here']

def read_test_data_in_batches():
batch = []
for i in range(10000 * 100):
if i % 50000 == 0:
print(i)
if len(batch) > 10000:
yield batch
batch = []
batch.append({
'_index': 'wentao-test-doc-values',
'_type': 'testdata',
'_source': {'name': random.choice(words)}
})
print(i)
yield batch

磁盘占用是

size: 28.5Mi (28.5Mi)
docs: 1,000,000 (1,000,000)

把每个word搞长一些,同样是插入100万行

words = ['hello' * 100, 'world' * 100, 'there' * 100, 'here' * 100]

def read_test_data_in_batches():
batch = []
for i in range(10000 * 100):
if i % 50000 == 0:
print(i)
if len(batch) > 10000:
yield batch
batch = []
batch.append({
'_index': 'wentao-test-doc-values',
'_type': 'testdata',
'_source': {'name': random.choice(words)}
})
print(i)
yield batch

磁盘占用不升反降

size: 14.4Mi (14.4Mi)
docs: 1,000,000 (1,000,000)

这说明了lucene在底层用列式存储这些字符串的时候是做了压缩的。这个要是在某个商业列式数据库里,就这么点优化都是要大书特书的dictionary encoding优化云云。

Nested Document

实验表明把一堆小文档打包成一个大文档的nested document可以压缩存储空间。把前面的mapping改成这样:

mappings = {
'testdata': {
'_source': {'enabled': False},
'_all': {'enabled': False},
'properties': {
'children': {
'type': 'nested',
'properties': {
'name': {
'type': 'string',
'index': 'no',
'store': False,
'dynamic': 'strict',
'fielddata': {'format': 'doc_values'}
}
}
}
}
}
}

还是插入100万行,但是每一千行打包成一个大文档

words = ['hello', 'world', 'there', 'here']

def read_test_data_in_batches():
batch = []
for i in range(10000 * 100):
if i % 50000 == 0:
print(i)
if len(batch) > 1000:
yield [{
'_index': 'wentao-test-doc-values2',
'_type': 'testdata',
'_source': {'children': batch}
}]
batch = []
batch.append({'name': random.choice(words)})
print(i)
yield [{
'_index': 'wentao-test-doc-values2',
'_type': 'testdata',
'_source': {'children': batch}
}]

磁盘占用是

size: 2.47Mi (2.47Mi)
docs: 1,001,000 (1,001,000)

文档数没有变小,但是磁盘空间仅仅占用了2.47M。这个应该受益于lucene内部对于嵌套文档的存储优化。

Elasticsearch压缩索引——lucene倒排索引本质是列存储+使用嵌套文档可以大幅度提高压缩率的更多相关文章

  1. ElasticSearch入门 第四篇:使用C#添加和更新文档

    这是ElasticSearch 2.4 版本系列的第四篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  2. 读《深入理解Elasticsearch》点滴-对象类型、嵌套文档、父子关系

    一.对象类型 1.mapping定义文件 "title":{ "type":"text" }, "edition":{ ...

  3. amazon redshift 分析型数据库特点——本质还是列存储

    Amazon Redshift 是一种快速且完全托管的 PB 级数据仓库,使您可以使用现有的商业智能工具经济高效地轻松分析您的所有数据.从最低 0.25 USD 每小时 (不承担任何义务) 直到每年每 ...

  4. 时间序列数据库选型——本质是列存储,B-tree索引,抑或是搜索引擎中的倒排索引

    时间序列数据库最多,使用也最广泛.一般人们谈论时间序列数据库的时候指代的就是这一类存储.按照底层技术不同可以划分为三类. 直接基于文件的简单存储:RRD Tool,Graphite Whisper.这 ...

  5. Druid.io索引过程分析——时间窗,列存储,LSM树,充分利用内存,concise压缩

    Druid底层不保存原始数据,而是借鉴了Apache Lucene.Apache Solr以及ElasticSearch等检索引擎的基本做法,对数据按列建立索引,最终转化为Segment,用于存储.查 ...

  6. OpenTSDB介绍——基于Hbase的分布式的,可伸缩的时间序列数据库,而Hbase本质是列存储

    原文链接:http://www.jianshu.com/p/0bafd0168647 OpenTSDB介绍 1.1.OpenTSDB是什么?主要用途是什么? 官方文档这样描述:OpenTSDB is ...

  7. ELK学习笔记之ElasticSearch的索引详解

    0x00 ElasticSearch的索引和MySQL的索引方式对比 Elasticsearch是通过Lucene的倒排索引技术实现比关系型数据库更快的过滤.特别是它对多条件的过滤支持非常好,比如年龄 ...

  8. elasticsearch——海量文档高性能索引系统

    elasticsearch elasticsearch是一个高性能高扩展性的索引系统,底层基于apache lucene. 可结合kibana工具进行可视化. 概念: index 索引: 类似SQL中 ...

  9. 〈二〉ElasticSearch的认识:索引、类型、文档

    目录 上节回顾 本节前言 索引index 创建索引 查看索引 查看单个索引 查看所有索引 删除索引 修改索引 修改副本分片数量 关闭索引 索引别名 增加索引别名: 查看索引别名: 删除索引别名: 补充 ...

随机推荐

  1. 解决[[NSFileManager defaultManager] contentsOfDirectoryAtPath 方法获取不到数据的bug

    在说这个问题之前,必须先解释一下,我们在引入project的时候,xcode会给我们3个选项 1.Copy items if needed 主要是说明,是否要将文件复制到project所在文件夹. 假 ...

  2. android studio中取消关联git

    Android studio取消关联Git 步骤如下 settings->version control 这里是已经取消关联的 如果关联 按住减号即可

  3. golang 常用的日期方法和时区的坑

    import( "time" ) 1.获取当前时间 time.Now(),返回类型:time结构. 2.字符串转为日期 t, _ := time.ParseInLocation(& ...

  4. Django相关介绍

    先认识一下MVC框架 MVC的框架模式,即模型M,视图V和控制器C.他们之间以一种插件似的,松耦合的方式连接在一起. Model(模型)是应用程序中用于处理应用程序数据逻辑的部分. 通常模型对象负责在 ...

  5. DP专题·二

    1.hdu 1260 Tickets 题意:有k个人,售票员可以选择一个人卖,或者同时卖给相邻的两个人.问最少的售票时间. 思路:dp[i] = min(dp[i - 1] + singlep[i], ...

  6. python网络编程——IO多路复用select/poll/epoll的使用

    转载博客: http://www.haiyun.me/archives/1056.html http://www.cnblogs.com/coser/archive/2012/01/06/231521 ...

  7. netty4----netty5的客户端和服务端

    服务端: package com.server; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; ...

  8. netty2---服务端和客户端

    客户端: package com.client; import java.net.InetSocketAddress; import java.util.Scanner; import java.ut ...

  9. 【Flask】Flask Restful api

    ### 安装: Flask-Restful需要在Flask 0.8以上的版本,在Python2.6或者Python3.3上运行.通过pip install flask-restful即可安装. ### ...

  10. maven私服客户端配置

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...