<commit_before>[[mapping-ttl-field]]
=== `_ttl` field

Some types of documents, such as session data or special offers, come with an
expiration date. The `_ttl` field allows you to specify the minimum time a
document should live, after which time the document is deleted automatically.

[TIP]
.Prefer index-per-timeframe to TTL
======================================================

With TTL , expired documents first have to be marked as deleted then later
purged from the index when segments are merged.  For append-only time-based
data such as log events, it is much more efficient to use an index-per-day /
week / month instead of TTLs.  Old log data can be removed by simply deleting
old indices.

======================================================

The `_ttl` field may be enabled as follows:

[source,js]
-------------------------------
PUT my_index
{
  "mappings": {
    "my_type": {
      "_ttl": {
        "enabled": true
      }
    }
  }
}

PUT my_index/my_type/1?ttl=10m <1>
{
  "text": "Will expire in 10 minutes"
}

PUT my_index/my_type/2 <2>
{
  "text": "Will not expire"
}
-------------------------------
// AUTOSENSE
<1> This document will expire 10 minutes after being indexed.
<2> This document has no TTL set and will not expire.

The expiry time is calculated as the value of the
<<mapping-timestamp-field,`_timestamp`>> field (or `now()` if the `_timestamp`
is not enabled) plus the `ttl` specified in the indexing request.

==== Default TTL

You can provide a default `_ttl`, which will be applied to indexing requests where the `ttl` is not specified:

[source,js]
-------------------------------
PUT my_index
{
  "mappings": {
    "my_type": {
      "_ttl": {
        "enabled": true,
        "defaut": "5m"
      }
    }
  }
}

PUT my_index/my_type/1?ttl=10m <1>
{
  "text": "Will expire in 10 minutes"
}

PUT my_index/my_type/2 <2>
{
  "text": "Will expire in 5 minutes"
}
-------------------------------
// AUTOSENSE
<1> This document will expire 10 minutes after being indexed.
<2> This document has no TTL set and so will expire after the default 5 minutes.

The `default` value can use <<time-units,time units>> like `d` for days, and
will use `ms` as the default unit if no time unit is provided.

You can dynamically update the `default` value using the put mapping
API. It won't change the `_ttl` of already indexed documents but will be
used for future documents.

==== Note on documents expiration

Expired documents will be automatically deleted periodoically. The following
settings control the expiry process:

`indices.ttl.interval`::

How often the purge process should run. Defaults to `60s`. Expired documents
may still be retrieved before they are purged.

`indices.ttl.bulk_size`::

How many deletions are handled by a single <<docs-bulk,`bulk`>> request. The
default value is `10000`.

==== Note on `detect_noop`
If an update tries to update just the `_ttl` without changing the `_source` of
the document it's expiration time won't be updated if `detect_noop` is `true`.
In 2.1 `detect_noop` defaults to `true`.
<commit_msg>Fix typo in TTL field docs<commit_after>[[mapping-ttl-field]]
=== `_ttl` field

Some types of documents, such as session data or special offers, come with an
expiration date. The `_ttl` field allows you to specify the minimum time a
document should live, after which time the document is deleted automatically.

[TIP]
.Prefer index-per-timeframe to TTL
======================================================

With TTL , expired documents first have to be marked as deleted then later
purged from the index when segments are merged.  For append-only time-based
data such as log events, it is much more efficient to use an index-per-day /
week / month instead of TTLs.  Old log data can be removed by simply deleting
old indices.

======================================================

The `_ttl` field may be enabled as follows:

[source,js]
-------------------------------
PUT my_index
{
  "mappings": {
    "my_type": {
      "_ttl": {
        "enabled": true
      }
    }
  }
}

PUT my_index/my_type/1?ttl=10m <1>
{
  "text": "Will expire in 10 minutes"
}

PUT my_index/my_type/2 <2>
{
  "text": "Will not expire"
}
-------------------------------
// AUTOSENSE
<1> This document will expire 10 minutes after being indexed.
<2> This document has no TTL set and will not expire.

The expiry time is calculated as the value of the
<<mapping-timestamp-field,`_timestamp`>> field (or `now()` if the `_timestamp`
is not enabled) plus the `ttl` specified in the indexing request.

==== Default TTL

You can provide a default `_ttl`, which will be applied to indexing requests where the `ttl` is not specified:

[source,js]
-------------------------------
PUT my_index
{
  "mappings": {
    "my_type": {
      "_ttl": {
        "enabled": true,
        "default": "5m"
      }
    }
  }
}

PUT my_index/my_type/1?ttl=10m <1>
{
  "text": "Will expire in 10 minutes"
}

PUT my_index/my_type/2 <2>
{
  "text": "Will expire in 5 minutes"
}
-------------------------------
// AUTOSENSE
<1> This document will expire 10 minutes after being indexed.
<2> This document has no TTL set and so will expire after the default 5 minutes.

The `default` value can use <<time-units,time units>> like `d` for days, and
will use `ms` as the default unit if no time unit is provided.

You can dynamically update the `default` value using the put mapping
API. It won't change the `_ttl` of already indexed documents but will be
used for future documents.

==== Note on documents expiration

Expired documents will be automatically deleted periodoically. The following
settings control the expiry process:

`indices.ttl.interval`::

How often the purge process should run. Defaults to `60s`. Expired documents
may still be retrieved before they are purged.

`indices.ttl.bulk_size`::

How many deletions are handled by a single <<docs-bulk,`bulk`>> request. The
default value is `10000`.

==== Note on `detect_noop`
If an update tries to update just the `_ttl` without changing the `_source` of
the document it's expiration time won't be updated if `detect_noop` is `true`.
In 2.1 `detect_noop` defaults to `true`.

{'fraction_non_alphanumeric': 0.16120661693156016, 'fraction_numerical': 0.01167693804735647, 'mean_word_length': 3.253103448275862, 'pattern_counts': {'":': 26, '<': 31, '<?xml version=': 0, '>': 31, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3100119', 'n_tokens_mistral': 1896, 'n_tokens_neox': 1788, 'n_words': 807}