排序

排序 #

默认情况下,全文查询按相关性 _score 排序。你也可以按任意字段值升序/降序排序,或使用地理距离、脚本等高级排序方式。

相关指南 #


基础字段排序 #

通过 sort 参数指定排序字段和顺序:

GET shakespeare/_search
{
  "query": {
    "term": {
      "play_name": { "value": "Henry IV" }
    }
  },
  "sort": [
    { "line_id": { "order": "desc" } }
  ]
}

排序参数 #

参数说明可选值
order排序方向asc(升序)、desc(降序)
mode多值字段的聚合模式minmaxavgsummedian
missing缺失值的处理方式_first(排最前)、_last(排最后)、自定义值
unmapped_type未映射字段的假设类型字段类型名(如 longdate

多级排序 #

sort 是数组,可以配置多级排序。当主排序键相同时,使用次排序键:

GET shakespeare/_search
{
  "query": {
    "term": {
      "play_name": { "value": "Henry IV" }
    }
  },
  "sort": [
    { "line_id": { "order": "desc" } },
    { "speech_number": { "order": "desc" } }
  ]
}

多值字段排序(mode) #

对于数组类型的数值字段,通过 mode 选择聚合值用于排序:

GET products/_search
{
  "sort": [
    {
      "price": {
        "order": "asc",
        "mode": "avg"
      }
    }
  ]
}

缺失值处理(missing) #

控制当文档缺少排序字段时的排列位置:

GET products/_search
{
  "sort": [
    {
      "price": {
        "order": "asc",
        "missing": "_last"
      }
    }
  ]
}

按 keyword 字段排序 #

被分析过的 text 字段不能直接排序,因为倒排索引只包含拆分后的 term。常见做法是使用 keyword 子字段:

GET shakespeare/_search
{
  "query": {
    "term": {
      "play_name": { "value": "Henry IV" }
    }
  },
  "sort": [
    { "play_name.keyword": { "order": "desc" } }
  ]
}

地理距离排序(_geo_distance) #

按地理位置距离排序,适合"附近的店铺"等场景:

GET restaurants/_search
{
  "sort": [
    {
      "_geo_distance": {
        "location": { "lat": 40.715, "lon": -73.998 },
        "order": "asc",
        "unit": "km",
        "distance_type": "arc"
      }
    }
  ]
}

_geo_distance 参数 #

参数说明默认值
location(字段名)参考坐标点必填
order排序方向asc
unit距离单位(kmmmiyd 等)m
distance_type距离计算方式arc(精确)或 plane(快速近似)
mode多点字段的取值模式min

脚本排序(_script) #

使用 Painless 脚本自定义排序逻辑:

GET products/_search
{
  "sort": [
    {
      "_script": {
        "type": "number",
        "script": {
          "source": "doc['price'].value * doc['discount'].value"
        },
        "order": "asc"
      }
    }
  ]
}

_script 参数 #

参数说明
type排序值类型(numberstring
script.sourcePainless 脚本
script.params脚本参数
order排序方向

嵌套字段排序(nested) #

对 nested 对象内的字段排序:

GET products/_search
{
  "sort": [
    {
      "reviews.rating": {
        "order": "desc",
        "nested": {
          "path": "reviews",
          "filter": {
            "term": { "reviews.verified": true }
          }
        }
      }
    }
  ]
}

nested.filter 可选,用于只对满足条件的嵌套文档参与排序计算。


按 _score 排序 #

显式按相关性分数排序(默认行为),通常配合其他排序字段使用:

GET shakespeare/_search
{
  "query": {
    "match": { "text_entry": "to be" }
  },
  "sort": [
    { "_score": { "order": "desc" } },
    { "line_id": { "order": "asc" } }
  ]
}

提示:使用自定义 sort 后,默认不再返回 _score。如果需要同时获取相关性分数,设置 "track_scores": true