| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 | [[tune-for-disk-usage]]== Tune for disk usage[discrete]=== Disable the features you do not needBy default, {es} indexes and adds doc values to most fields so that theycan be searched and aggregated out of the box. For instance, if you have a numericfield called `foo` that you need to run histograms on but that you never need tofilter on, you can safely disable indexing on this field in your<<mappings,mappings>>:[source,console]----PUT index{  "mappings": {    "properties": {      "foo": {        "type": "integer",        "index": false      }    }  }}----<<text,`text`>> fields store normalization factors in the index to facilitatedocument scoring. If you only need matching capabilities on a `text`field but do not care about the produced scores, you can use the<<match-only-text-field-type,`match_only_text`>> type instead. This field typesaves significant space by dropping scoring and positional information.[discrete][[default-dynamic-string-mapping]]=== Don't use default dynamic string mappingsThe default <<dynamic-mapping,dynamic string mappings>> will index string fieldsboth as <<text,`text`>> and <<keyword,`keyword`>>. This is wasteful if you onlyneed one of them. Typically an `id` field will only need to be indexed as a`keyword` while a `body` field will only need to be indexed as a `text` field.This can be disabled by either configuring explicit mappings on string fieldsor setting up dynamic templates that will map string fields as either `text`or `keyword`.For instance, here is a template that can be used in order to only map stringfields as `keyword`:[source,console]--------------------------------------------------PUT index{  "mappings": {    "dynamic_templates": [      {        "strings": {          "match_mapping_type": "string",          "mapping": {            "type": "keyword"          }        }      }    ]  }}--------------------------------------------------[discrete]=== Watch your shard sizeLarger shards are going to be more efficient at storing data. To increase the size of your shards, you can decrease the number of primary shards in an index by <<indices-create-index,creating indices>> with fewer primary shards, creating fewer indices (e.g. by leveraging the <<indices-rollover-index,Rollover API>>), or modifying an existing index using the <<indices-shrink-index,Shrink API>>.Keep in mind that large shard sizes come with drawbacks, such as long full recovery times.[discrete][[disable-source]]=== Disable `_source`The <<mapping-source-field,`_source`>> field stores the original JSON body of the document. If you don’t need access to it you can disable it. However, APIs that needs access to `_source` such as update and reindex won’t work.[discrete][[best-compression]]=== Use `best_compression`The `_source` and stored fields can easily take a non negligible amount of diskspace. They can be compressed more aggressively by using the `best_compression`<<index-codec,codec>>.[discrete]=== Force mergeIndices in Elasticsearch are stored in one or more shards. Each shard is a Lucene index and made up of one or more segments - the actual files on disk. Larger segments are more efficient for storing data.The <<indices-forcemerge,force merge API>> can be used to reduce the number of segments per shard. In many cases, the number of segments can be reduced to one per shard by setting `max_num_segments=1`.include::{es-repo-dir}/indices/forcemerge.asciidoc[tag=force-merge-read-only-warn][discrete]=== Shrink indexThe <<indices-shrink-index,shrink API>> allows you to reduce the number of shards in an index. Together with the force merge API above, this can significantly reduce the number of shards and segments of an index.[discrete]=== Use the smallest numeric type that is sufficientThe type that you pick for <<number,numeric data>> can have a significant impacton disk usage. In particular, integers should be stored using an integer type(`byte`, `short`, `integer` or `long`) and floating points should either bestored in a `scaled_float` if appropriate or in the smallest type that fits theuse-case: using `float` over `double`, or `half_float` over `float` will helpsave storage.[discrete]=== Use index sorting to colocate similar documentsWhen Elasticsearch stores `_source`, it compresses multiple documents at oncein order to improve the overall compression ratio. For instance it is verycommon that documents share the same field names, and quite common that theyshare some field values, especially on fields that have a low cardinality ora {wikipedia}/Zipf%27s_law[zipfian] distribution.By default documents are compressed together in the order that they are addedto the index. If you enabled <<index-modules-index-sorting,index sorting>>then instead they are compressed in sorted order. Sorting documents with similarstructure, fields, and values together should improve the compression ratio.[discrete]=== Put fields in the same order in documentsDue to the fact that multiple documents are compressed together into blocks,it is more likely to find longer duplicate strings in those `_source` documentsif fields always occur in the same order.[discrete][[roll-up-historical-data]]=== Roll up historical dataKeeping older data can useful for later analysis but is often avoided due tostorage costs. You can use data rollups to summarize and store historical dataat a fraction of the raw data's storage cost. See <<xpack-rollup>>.
 |