123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- [[search-request-sort]]
- === Sort
- 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.
- [source,js]
- --------------------------------------------------
- {
- "sort" : [
- { "post_date" : {"order" : "asc"}},
- "user",
- { "name" : "desc" },
- { "age" : "desc" },
- "_score"
- ],
- "query" : {
- "term" : { "user" : "kimchy" }
- }
- }
- --------------------------------------------------
- ==== Sort Values
- The sort values for each document returned are also returned as part of
- the response.
- ==== Sort mode option
- 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:
- [horizontal]
- `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.
- ===== Sort mode example usage
- In the example below the field price has multiple prices per document.
- In this case the result hits will be sort by price ascending based on
- the average price per document.
- [source,js]
- --------------------------------------------------
- curl -XPOST 'localhost:9200/_search' -d '{
- "query" : {
- ...
- },
- "sort" : [
- {"price" : {"order" : "asc", "mode" : "avg"}}
- ]
- }'
- --------------------------------------------------
- ==== Sorting within nested objects.
- 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 the on what nested object to sort. The actual
- sort field must be a direct field inside this nested object. The default
- is to use the most immediate inherited nested object from the sort
- field.
- `nested_filter`::
- A filter 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.
- ===== Nested sorting example
- In the below example `offer` is a field of type `nested`. Because
- `offer` is the closest inherited nested field, it is picked as
- `nested_path`. Only the inner objects that have color blue will
- participate in sorting.
- [source,js]
- --------------------------------------------------
- curl -XPOST 'localhost:9200/_search' -d '{
- "query" : {
- ...
- },
- "sort" : [
- {
- "offer.price" : {
- "mode" : "avg",
- "order" : "asc",
- "nested_filter" : {
- "term" : { "offer.color" : "blue" }
- }
- }
- }
- ]
- }'
- --------------------------------------------------
- Nested sorting is also supported when sorting by
- scripts and sorting by geo distance.
- ==== Missing Values
- 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). For example:
- [source,js]
- --------------------------------------------------
- {
- "sort" : [
- { "price" : {"missing" : "_last"} },
- ],
- "query" : {
- "term" : { "user" : "kimchy" }
- }
- }
- --------------------------------------------------
- NOTE: If a nested inner object doesn't match with
- the `nested_filter` then a missing value is used.
- ==== Ignoring Unmapped Fields
- By default, the search request will fail if there is no mapping
- associated with a field. The `ignore_unmapped` option allows to ignore
- fields that have no mapping and not sort by them. Here is an example of
- how it can be used:
- [source,js]
- --------------------------------------------------
- {
- "sort" : [
- { "price" : {"ignore_unmapped" : true} },
- ],
- "query" : {
- "term" : { "user" : "kimchy" }
- }
- }
- --------------------------------------------------
- ==== Geo Distance Sorting
- Allow to sort by `_geo_distance`. Here is an example:
- [source,js]
- --------------------------------------------------
- {
- "sort" : [
- {
- "_geo_distance" : {
- "pin.location" : [-70, 40],
- "order" : "asc",
- "unit" : "km"
- }
- }
- ],
- "query" : {
- "term" : { "user" : "kimchy" }
- }
- }
- --------------------------------------------------
- Note: the geo distance sorting supports `sort_mode` options: `min`,
- `max` and `avg`.
- The following formats are supported in providing the coordinates:
- ===== Lat Lon as Properties
- [source,js]
- --------------------------------------------------
- {
- "sort" : [
- {
- "_geo_distance" : {
- "pin.location" : {
- "lat" : 40,
- "lon" : -70
- },
- "order" : "asc",
- "unit" : "km"
- }
- }
- ],
- "query" : {
- "term" : { "user" : "kimchy" }
- }
- }
- --------------------------------------------------
- ===== Lat Lon as String
- Format in `lat,lon`.
- [source,js]
- --------------------------------------------------
- {
- "sort" : [
- {
- "_geo_distance" : {
- "pin.location" : "-70,40",
- "order" : "asc",
- "unit" : "km"
- }
- }
- ],
- "query" : {
- "term" : { "user" : "kimchy" }
- }
- }
- --------------------------------------------------
- ===== Geohash
- [source,js]
- --------------------------------------------------
- {
- "sort" : [
- {
- "_geo_distance" : {
- "pin.location" : "drm3btev3e86",
- "order" : "asc",
- "unit" : "km"
- }
- }
- ],
- "query" : {
- "term" : { "user" : "kimchy" }
- }
- }
- --------------------------------------------------
- ===== Lat Lon as Array
- Format in `[lon, lat]`, note, the order of lon/lat here in order to
- conform with http://geojson.org/[GeoJSON].
- [source,js]
- --------------------------------------------------
- {
- "sort" : [
- {
- "_geo_distance" : {
- "pin.location" : [-70, 40],
- "order" : "asc",
- "unit" : "km"
- }
- }
- ],
- "query" : {
- "term" : { "user" : "kimchy" }
- }
- }
- --------------------------------------------------
- ==== Script Based Sorting
- Allow to sort based on custom scripts, here is an example:
- [source,js]
- --------------------------------------------------
- {
- "query" : {
- ....
- },
- "sort" : {
- "_script" : {
- "script" : "doc['field_name'].value * factor",
- "type" : "number",
- "params" : {
- "factor" : 1.1
- },
- "order" : "asc"
- }
- }
- }
- --------------------------------------------------
- Note, it is recommended, for single custom based script based sorting,
- to use `custom_score` query instead as sorting based on score is faster.
- ==== Track Scores
- When sorting on a field, scores are not computed. By setting
- `track_scores` to true, scores will still be computed and tracked.
- [source,js]
- --------------------------------------------------
- {
- "track_scores": true,
- "sort" : [
- { "post_date" : {"reverse" : true} },
- { "name" : "desc" },
- { "age" : "desc" }
- ],
- "query" : {
- "term" : { "user" : "kimchy" }
- }
- }
- --------------------------------------------------
- ==== Memory Considerations
- 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 six_hun types (like `short`, `integer` and
- `float`).
|