您的位置:首页 > 其它

搜索接口-排序(Search API-sort)

2015-10-20 16:02 585 查看
允许添加一个或多个排序到具体的某个字段。以及每个排序是可以逆转的。排序是定义在字段级别上的,通过_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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: