允许添加一个或多个排序到具体的某个字段。以及每个排序是可以逆转的。排序是定义在字段级别上的,通过_score字段,按得分排序。
{ "sort" : [ { "post_date" : {"order" : "asc"} }, "user", { "name" : "desc" }, { "age" : "desc" }, "_score" ], "query" : { "term" : { "user" : "kimchy" } } }
如果JSON解析器不支持数组的话,排序请求也可以组装成如下:
{ "sort" : { { "post_date" : {"order" : "asc"} }, "user" : { }, "_score" : { } }, "query" : { "term" : { "user" : "kimchy" } } }
排序值(Sort Values)
对于每个文档返回的排序值也是作为返回响应数据的一部分。
排序模式选项(Sort mode option)
从版本0.90.0.Beta1开始, Elasticsearch支持排序的数组字段就是被称为多值字段排序。模式选项控制那些数组的值被那来用于排序文档。模式选项可以具有以下值:
-
min
– 选择最低值。 -
max
– 选择的最高值。 -
sum
– 使用全部值的总和作为排序值。仅适用于基于数组的数值字段。 -
avg
– 使用全部值的平均值作为排序值。仅适用于基于数组的数值字段。
排序模式的用法示例(Sort mode example usage)
在下面这个例子中,每个文档(记录)的价格字段有多个价格。在这种情况下,命中的结果文档会按照平均价格的升序进行排序。
curl -XPOST 'localhost:9200/_search' -d '{ "query" : { ... }, "sort" : [ {"price" : {"order" : "asc", "mode" : "avg"}} ] }'
按内嵌对象排序(Sorting within nested objects)
从版本0.90.0.Beta1以后, Elasticsearch还支持按照字段内一个或多个嵌套对象进行排序。按内嵌对象排序,在已有参数的基础上还支持以下参数:
-
nested_path
- 定义以那个嵌套的对象进行排序。实际的排序字段必须是嵌套对象的直接字段。默认情况下是使用最直接的继承的嵌套对象的排序字段 -
nested_filter
– 过滤器,过滤能匹配上的内嵌对象的需要拿来排序的字段。常见的情况是重复的查询/过滤器内的嵌套过滤器或查询。默认情况下,nested_filter是关闭的。
嵌套排序的例子(Nested sorting example)
在下面的例子中,offer是一个嵌套字段类型。因为offer是最接近继承的嵌套字段,通过nested_path参数选择的。只有内嵌对象颜色为蓝色的,将参加排序。
curl -XPOST 'localhost:9200/_search' -d '{ "query" : { ... }, "sort" : [ { "offer.price" : { "mode" : "avg", "order" : "asc", "nested_filter" : { "term" : { "offer.color" : "blue" } } } } ] }'
缺失值(Missing Values)
文档里的数字字段支持空值处理。缺少的值,可以_last,_First,或自定义值(即被用于缺少文档的排序值)。例如:
{ "sort" : [ { "price" : {"missing" : "_last"} }, ], "query" : { "term" : { "user" : "kimchy" } } }
忽略未映射的字段(Ignoring Unmapped Fields)
默认情况下,如果字段没有相关联的映射,搜索请求将失败。ignore_unmapped参数可以忽略该字段,如果这个字段没有映射,并不通过该字段排序。下面有个例子:
{ "sort" : [ { "price" : {"ignore_unmapped" : true} }, ], "query" : { "term" : { "user" : "kimchy" } } }
地理距离排序(Geo Distance Sorting)
允许通过_geo_distance排序。下面是一个例子:
{ "sort" : [ { "_geo_distance" : { "pin.location" : [-70, 40], "order" : "asc", "unit" : "km" } } ], "query" : { "term" : { "user" : "kimchy" } } }
支持以下格式提供的坐标:
纬经度作为属性(Lat Lon as Properties)
{ "sort" : [ { "_geo_distance" : { "pin.location" : { "lat" : 40, "lon", -70 } "order" : "asc", "unit" : "km" } } ], "query" : { "term" : { "user" : "kimchy" } } }
纬经度作为字符串(Lat Lon as String)
格式用lat,lon
.
{ "sort" : [ { "_geo_distance" : { "pin.location" : "-70,40", "order" : "asc", "unit" : "km" } } ], "query" : { "term" : { "user" : "kimchy" } } }
地理坐标哈希值(Geohash)
{ "sort" : [ { "_geo_distance" : { "pin.location" : "drm3btev3e86", "order" : "asc", "unit" : "km" } } ], "query" : { "term" : { "user" : "kimchy" } } }
纬经度作为数组(Lat Lon as Array)
格式用[lon, lat]
, 注意, 纬经度的顺序必须和GeoJSON保持一致。
{ "sort" : [ { "_geo_distance" : { "pin.location" : [-70, 40], "order" : "asc", "unit" : "km" } } ], "query" : { "term" : { "user" : "kimchy" } } }
基于脚本的排序(Script Based Sorting)
允许基于自定义脚本排序,这里是一个例子:
{ "query" : { .... }, "sort" : { "_script" : { "script" : "doc['field_name'].value * factor", "type" : "number", "params" : { "factor" : 1.1 }, "order" : "asc" } } }
备注:如果使用单个定制脚本进行排序,推荐使用custom_score 查询代替基于比分的查询排序,这样更快。
跟踪得分(Track Scores)
当一个字段在排序的时候,分数没有计算好。通过将track_scores设置为true,分数仍旧将被计算和跟踪。
{ "track_scores": true, "sort" : [ { "post_date" : {"reverse" : true} }, { "name" : "desc" }, { "age" : "desc" } ], "query" : { "term" : { "user" : "kimchy" } } }
内存注意事项(Memory Considerations)
在排序的时候,有关排序的字段值被加载到内存中。这意味着,每个分片应该有足够的内存来包含这些内容。基于字符串类型的字段排序,不应该被分析/分词。对于数字类型,如果可能的话,建议明确设置字段类型(如短,整数,浮点数)。
转自 http://www.dongming8.cn/?p=471