如何在Elasticsearch中进行排序?

459 阅读2分钟

你可以使用排序关键字对Elasticsearch结果进行排序。排序查询要求你提供一个要排序的字段。Elasticsearch不支持对文本类型的字段进行排序。

在这个简短的指南中,我们将看看如何在Elasticsearch中对查询结果进行排序。

基本用法

你可以在查询中使用一行方法对结果进行排序。比如说:

GET /kibana_sample_data_flights/_search?<strong>q</strong>=DestCityName:Denver&sort=AvgTicketPrice

在上面的查询示例中,我们获取了DestCityName字段等于丹佛的所有文件,然后根据AvTicket Price对结果进行排序。

结果查询应该包括城市为丹佛的文件,票价按升序排序。

输出示例如图所示

虽然单行方法在你需要进行快速排序时很有帮助,但它的可读性不强,而且当你需要对多个字段进行排序时,会变得复杂。

为了解决这个问题,你可以使用推荐的Elasticsearch查询方法。例如,我们可以把上面的查询写成。

GET /kibana_sample_data_flights/_search
{
  "query": {
    "match": {
      "DestCityName": "Denver"
    }
  }
  , "sort": [
    {
      "AvgTicketPrice": {
        "order": "asc"
      }
    }
  ]
}

这个查询的功能与上面显示的单行方法类似。但是,它的描述性更强,更具有可读性。

按升序排序

要按反向顺序改变,你可以把顺序从asc改为desc,这将使数值从高到低排序,如图所示。

GET /kibana_sample_data_flights/_search
{
  "query": {
    "match": {
      "DestCityName": "Denver"
    }
  }
  , "sort": [
    {
      "AvgTicketPrice": {
        "order": "desc"
      }
    }
  ]
}

示例输出如图所示

地理距离排序

Elasticsearch允许你使用_geo_distance参数按地理信息排序。例如,考虑下面的查询。

GET /kibana_sample_data_flights/_search
{
  "query": {
    "match": {
      "DestCountry": "US"
    }
  },
  "sort": [
    {
      "_geo_distance": {
        "OriginLocation": {
          "lat": 30,
          "lon": -103
        },
        "order": "desc"
      }
    }
  ]
}

上述查询应返回目的地国家等于美国,且位置在指定经纬度范围内的记录。

按文本类型排序

排序并不局限于数值,你可以按文本排序,如:

GET /kibana_sample_data_flights/_search
{
  "query": {
    "match": {
      "DestCityName": "Sydney"
    }
  },
  "sort": [
    {
      "Carrier": {
        "order": "desc"
      }
    }
  ]
}

总结

在本教程中,我们介绍了如何使用排序关键字对Elasticsearch查询的结果进行排序。