索引压缩
> 文档中心 > 文档中心 > INFINI Easysearch > 功能手册 > 文档操作 > 索引压缩

索引压缩 #

索引编码 #

索引编码决定索引的存储字段如何被压缩和存储在磁盘上。索引编码由静态的 index.codec 设置来控制,该设置指定压缩算法。这个设置会影响索引分片的大小和索引操作的性能。

Easysearch 提供了多种基于索引编码的压缩方案,以降低索引的存储成本。

default – 该编码使用LZ4算法和预设字典,优先考虑性能而非压缩比。与best_compression相比,它提供更快的索引和搜索操作,但可能导致更大的索引/分片大小。如果在索引设置中未提供编码,则默认使用LZ4作为压缩算法。

best_compression – 该编码底层使用zlib算法进行压缩。它能实现高压缩比,从而减小索引大小。然而,这可能会增加索引操作期间的额外CPU使用,并可能随后导致较高的索引和搜索延迟。

从 Easysearch 1.1 开始,增加了基于 Zstandard 压缩算法的新编码方式。这种算法在压缩比和速度之间提供了良好的平衡。

ZSTD 与默认编解码器相比,该编解码器提供了与best_compression编解码器相当的压缩比,CPU使用合理,索引和搜索性能也有所提高。

source 复用 #

source_reuse: 启用 source_reuse 配置项能够去除 _source 字段中与 doc_values 或倒排索引重复的部分,从而有效减小索引总体大小,这个功能对日志类索引效果尤其明显。

source_reuse 支持对以下数据类型进行压缩:keyword,integer,long,short,boolean,float,half_float,double,geo_point,ip, 如果是 text 类型,需要默认启用 keyword 类型的 multi-field 映射。 以上类型必须启用 doc_values 映射(默认启用)才能压缩。

使用限制 #

当索引里包含 nested 类型映射,或插件额外提供的数据类型时,不能启用 source_reuse,例如 knn 索引。

压缩效果对比 #

Easysearch 压缩效果对比如下

  • 使用 Nginx 日志作为数据样本
  • 就 Elasticsearch 6.4.3 和 Easysearch 1.1 进行对比
  • 默认未开启压缩
  • 开启 best_compression 压缩
  • 开启 ZSTD 压缩
  • 开启 ZSTD 加 _source 优化

Easysearch 1.1 版本 相比 Elasticsearch 索引整体大小降低了40%~50%。

Elasticsearch v6.4.3

indexprirepdocs.countstore.sizepri.store.size
nginxt_default511000000413.1mb413.1mb
nginx_best111000000316.2mb316.2mb

Easysearch v1.1

indexprirepdocs.countstore.sizepri.store.size
nginxt_default111000000321.6mb321.6mb
nginx_best111000000262.8mb262.8mb
nginx_zstd111000000205.6mb205.6mb
nginx_reuse111000000157mb157mb

如何启用 #

单个索引配置示例 #

创建并设置索引的 codec 为ZSTD:

PUT test-index
{
  "settings": {
    "index.codec": "ZSTD"
  }
}

创建并设置索引的 codec 为ZSTD,并启用 source_reuse:

PUT test-index
{
  "settings": {
    "index.codec": "ZSTD",
    "index.source_reuse": "true"
  }
}

索引模板配置示例 #

在 index_template 配置 ZSTD 和 source_reuse:

PUT _index_template/daily_logs
{
  "index_patterns": [
    "logs-2020-*"
  ],
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 1,
      "index.codec": "ZSTD",
      "index.source_reuse": true
    },
    "mappings": {
      "properties": {
        "field1": {
          "type": "double"
        }
      }
    }
  }
}