Most numeric datatypes index extra terms representing numeric
ranges for each number to make range queries
faster. For instance, this range query:

"range": {
"number": {
"gte": 0
"lte": 321
}
}

might be executed internally as a terms query that
looks something like this:

"terms": {
"number": [
"0-255",
"256-319"
"320",
"321"
]
}

These extra terms greatly reduce the number of terms that have to be examined,
at the cost of increased disk space.

The default value for precision_step depends on the type of the numeric field:

long, double, date, ip

16 (3 extra terms)

integer, float, short

8 (3 extra terms)

byte

2147483647 (0 extra terms)

token_count

32 (0 extra terms)

The value of the precision_step setting indicates the number of bits that
should be compressed into an extra term. A long value consists of 64 bits,
so a precision_step of 16 results in the following terms: