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

允许添加一个或多个排序到具体的某个字段。以及每个排序是可以逆转的。排序是定义在字段级别上的,通过_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值