Allows to add one or more sort on specific fields. Each sort can be
reversed as well. The sort is defined on a per field level, with special
field name for _score to sort by score, and _doc to sort by index order.

_doc has no real use-case besides being the most efficient sort order.
So if you don’t care about the order in which documents are returned, then you
should sort by _doc. This especially helps when scrolling.

Elasticsearch supports sorting by array or multi-valued fields. The mode option
controls what array value is picked for sorting the document it belongs
to. The mode option can have the following values:

min

Pick the lowest value.

max

Pick the highest value.

sum

Use the sum of all values as sort value. Only applicable for
number based array fields.

avg

Use the average of all values as sort value. Only applicable
for number based array fields.

median

Use the median of all values as sort value. Only applicable
for number based array fields.

Elasticsearch also supports sorting by
fields that are inside one or more nested objects. The sorting by nested
field support has the following parameters on top of the already
existing sort options:

nested_path

Defines on which nested object to sort. The actual
sort field must be a direct field inside this nested object.
When sorting by nested field, this field is mandatory.

nested_filter

A filter that the inner objects inside the nested path
should match with in order for its field values to be taken into account
by sorting. Common case is to repeat the query / filter inside the
nested filter or query. By default no nested_filter is active.

The missing parameter specifies how docs which are missing
the field should be treated: The missing value can be
set to _last, _first, or a custom value (that
will be used for missing docs as the sort value).
The default is _last.

By default, the search request will fail if there is no mapping
associated with a field. The unmapped_type option allows to ignore
fields that have no mapping and not sort by them. The value of this
parameter is used to determine what sort values to emit. Here is an
example of how it can be used:

If any of the indices that are queried doesn’t have a mapping for price
then Elasticsearch will handle it as if there was a mapping of type
long, with all documents in this index having no value for this field.

How to compute the distance. Can either be arc (default), or plane (faster, but inaccurate on long distances and close to the poles).

mode

What to do in case a field has several geo points. By default, the shortest
distance is taken into account when sorting in ascending order and the
longest distance when sorting in descending order. Supported values are
min, max, median and avg.

unit

The unit to use when computing sort values. The default is m (meters).

geo distance sorting does not support configurable missing values: the
distance will always be considered equal to Infinity when a document does not
have values for the field that is used for distance computation.

When sorting, the relevant sorted field values are loaded into memory.
This means that per shard, there should be enough memory to contain
them. For string based types, the field sorted on should not be analyzed
/ tokenized. For numeric types, if possible, it is recommended to
explicitly set the type to narrower types (like short, integer and
float).