你可以使用排序关键字对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查询的结果进行排序。