调整磁盘使用量编辑

禁用不需要的功能编辑

默认情况下,Elasticsearch 会对大多数字段进行索引并添加文档值,以便可以直接搜索和聚合它们。例如,如果您有一个名为 foo 的数字字段,您需要对其运行直方图但从不需要对其进行过滤,则可以在 映射 中安全地禁用对此字段的索引

response = client.indices.create(
  index: 'index',
  body: {
    mappings: {
      properties: {
        foo: {
          type: 'integer',
          index: false
        }
      }
    }
  }
)
puts response
PUT index
{
  "mappings": {
    "properties": {
      "foo": {
        "type": "integer",
        "index": false
      }
    }
  }
}

text 字段在索引中存储归一化因子以方便文档评分。如果您只需要 text 字段上的匹配功能,但并不关心生成的分数,则可以使用 match_only_text 类型。此字段类型通过删除评分和位置信息来节省大量空间。

不要使用默认的动态字符串映射编辑

默认的 动态字符串映射 会将字符串字段同时索引为 textkeyword。如果您只需要其中之一,这将造成浪费。通常,id 字段只需要索引为 keyword,而 body 字段只需要索引为 text 字段。

可以通过在字符串字段上配置显式映射或设置将字符串字段映射为 textkeyword 的动态模板来禁用此功能。

例如,以下模板可用于仅将字符串字段映射为 keyword

response = client.indices.create(
  index: 'index',
  body: {
    mappings: {
      dynamic_templates: [
        {
          strings: {
            match_mapping_type: 'string',
            mapping: {
              type: 'keyword'
            }
          }
        }
      ]
    }
  }
)
puts response
PUT index
{
  "mappings": {
    "dynamic_templates": [
      {
        "strings": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ]
  }
}

关注分片大小编辑

较大的分片在存储数据方面效率更高。要增加分片的大小,可以通过以下方式减少索引中的主分片数量:创建索引 时使用更少的主分片、创建更少的索引(例如,利用 滚动 API)或使用 收缩 API 修改现有索引。

请记住,较大的分片大小也有一些缺点,例如完全恢复时间较长。

禁用 _source编辑

_source 字段存储文档的原始 JSON 正文。如果您不需要访问它,则可以禁用它。但是,需要访问 _source 的 API(例如更新、突出显示和重新索引)将无法工作。

使用 best_compression编辑

_source 和存储字段很容易占用大量的磁盘空间。可以使用 best_compression 编解码器 对其进行更积极的压缩。

强制合并编辑

Elasticsearch 中的索引存储在一个或多个分片中。每个分片都是一个 Lucene 索引,由一个或多个段组成,这些段是磁盘上的实际文件。较大的段存储数据效率更高。

强制合并 API 可用于减少每个分片的段数。在许多情况下,可以通过设置 max_num_segments=1 将每个分片的段数减少到一个。

我们建议仅对只读索引(即不再接收写入的索引)进行强制合并。 当文档被更新或删除时,旧版本不会立即被删除,而是被软删除并标记为“墓碑”。这些软删除的文档会在定期段合并期间自动清理。但是,强制合并可能会导致生成非常大(> 5GB)的段,这些段不符合定期合并的条件。因此,软删除的文档数量可能会迅速增长,导致磁盘使用量增加,搜索性能下降。如果您定期强制合并接收写入的索引,这也可能会使快照成本更高,因为新文档无法增量备份。

收缩索引编辑

收缩 API 允许您减少索引中的分片数量。结合上面的强制合并 API,这可以显著减少索引的分片和段的数量。

使用足够小的数字类型编辑

您为 数字数据 选择的类型会对磁盘使用量产生重大影响。特别是,整数应该使用整数类型(byteshortintegerlong)存储,而浮点数应该存储在 scaled_float 中(如果适用),或者存储在适合用例的最小类型中:使用 float 而不是 double,或者使用 half_float 而不是 float 将有助于节省存储空间。

使用索引排序将相似文档放在一起编辑

当 Elasticsearch 存储 _source 时,它会一次压缩多个文档,以提高整体压缩率。例如,文档共享相同的字段名是很常见的,而且它们共享某些字段值也很常见,尤其是在基数较低或 齐普夫定律 分布的字段上。

默认情况下,文档按添加到索引的顺序进行压缩。如果您启用了 索引排序,则它们将按排序顺序进行压缩。将结构、字段和值相似的文档排序在一起应该可以提高压缩率。

在文档中按相同顺序放置字段编辑

由于多个文档被压缩到块中,如果字段始终以相同的顺序出现,则更有可能在这些 _source 文档中找到更长的重复字符串。

汇总历史数据编辑

保留旧数据对于以后的分析很有用,但由于存储成本的原因,通常会避免这样做。您可以使用下采样来汇总和存储历史数据,其存储成本仅为原始数据的一小部分。请参阅 下采样时间序列数据流