# 磁盘使用调优

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/5.3/tune-for-disk-usage.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/tune-for-disk-usage.html)

译文链接 : [磁盘使用调优](/pages/viewpage.action?pageId=9405601)

贡献者 : @李坚，[ApacheCN](/display/~apachecn)，[Apache中文网](/display/~apachechina)

## 禁用不需要的功能

默认情况下，_elasticsearch _索引并且新增数据到大多数的字段中，以便于它们能够被索引和聚合。比如，你有一个叫 _foo_ 的数字 _field（字段）_，你想要一个 _histograms__（直方图）_ 但是不需要过滤，那么就可以在 _mappings（映射）_ 中禁用这用这个 _field（字段）_的索引。

```
PUT index
{
  "mappings": {
    "type": {
      "properties": {
        "foo": {
          "type": "integer",
          "index": false
        }
      }
    }
  }
}
```

_text field（文本字段）_在索引中规范化的存储是为了对 _documents_ 进行评分。如果你只想要 text field（文本字段）的匹配功能，不关心生成的分数，可以在 elasticsearch中配置中成不向索引编写规范：

```
PUT index
{
  "mappings": {
    "type": {
      "properties": {
        "foo": {
          "type": "text",
          "norms": false
        }
      }
    }
  }
}
```

_text field（文本字段）_ 默认情况下还存储了在索引的频率和位置，频率用于计算得分，而位置用于短语查询；如果不需要进行短语查询，你可以告诉 _elasticsearch _不索引位置：

```
PUT index
{
  "mappings": {
    "type": {
      "properties": {
        "foo": {
          "type": "text",
          "index_options": "freqs"
        }
      }
    }
  }
}
```

此外，如果你不关心得分，可以配置 _elasticsearch _ 只索引匹配到的 _documents_  （文档）。这个字段仍然可以被搜索，但是短语查询的时候会报错并且得分将假设每个 _documents_  （文档）中只出现一次。

```
PUT index
{
  "mappings": {
    "type": {
      "properties": {
        "foo": {
          "type": "text",
          "norms": false,
          "index_options": "freqs"
        }
      }
    }
  }
}
```

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

默认的 _dynamic string mappings （动态字符串映射）_将以 _text（文本）_和 _keywords（关键字）_的形式对字符串字段进行索引。如果你只需要使用它们中的一种，这么做是浪费的。通常 _id field（id 字段）_只需要被当成 _keywords（关键字）_来索引，而 _body field（字段）_只需要被当成 _text（文本） field（字段）_来索引。

禁用 _dynamic string mappings （动态字符串映射）_方法有：明确 _string fields（字符串字段）_的 _mapping（映射）_或者为 _text（文本）_和 _keywords（关键字）_映射的字符串字段设置动态 _templates（模版） 。_

例如，这是一个将字符串字段映射为 _keywords（关键字）_ 的模版：

```
PUT index
{
  "mappings": {
    "type": {
      "dynamic_templates": [
        {
          "strings": {
            "match_mapping_type": "string",
            "mapping": {
              "type": "keyword"
            }
          }
        }
      ]
    }
  }
}
```

## 禁用 __all_

__all field（字段）_ 将会索引所有字段中的所有值，这将会很大的空间。如果你不需要同时搜索所有字段，可以禁用 __all field（字段）_。

## 使用 _best_compression_

_source 和 存储的字段将会占用很大的存储空间。可以使用 _best_compression  codec（编解码器）_ 进行有效的压缩。

## 使用最合适的最小数字类型

您为数字数据选择的类型可能会对磁盘使用量产生重大影响。特别地，整数应该使用整数类型（_byte, short, integer or long_）（字节，短整数或长整数）存储，并且浮点应该被存储在 _scaling_float_ 中，如果合适的话也可以存储在符合用例的最小类型中：使用 _float over double_ 或 浮点数的 _half_float_ 将有助于节省存储空间。