排序(sorting)
为了通过相关度进行排序,需要把相关度作为一个数值,ES中相关度使用浮点型的_score表示搜索结果返回的相关度,默认的是按照_score降序排序。
有时候你并不需要一个有意义的socre。例如,下面的查询返回tweets中所有的user_id中包含1的document:
GET /_search
{
"query":{
"filtered":{
"filter":{
"term":{
"user_id":1
}
}
}
}
}
过滤器没有_score,但是隐含的match_all查询设置了_score为1。也就是说,所有的document的相关度都是相等的。
sorting by field values
这个情况下,对tweets进行插入时间的排序是有意义的,最近插入的排在前面。我们能这样进行排序:
GET /_search
{
"query":{
"filtered":{
"filter":{"term":{"user_id":1}}
}
},
"sort":{"date":{"order":"desc"}}
}
你能在结果中发现两个不同之处:
"hits":{
"total": 6,
"max_score": null,
"hits":[{
"_index": "us",
"_type": "tweet",
"_id": "14",
"_score": null,
"_source": {
"date": "2014-09-24",
...
},
"sort": [1411516800000]
},
...
}
标记12表明_score没有计算,因为他不参与排序。
标记3表明使用从纪元开始表示的data字段的毫秒值,参与了排序。
首先我们有了一个新的名sort的元素,这个元素用来排序。这个情况下,我们根据data排序,这个数字1411516800000就相当于2014-09-24 00:00:00 UTC。
其次_score和max_score都是null。计算_score的代价是昂贵的,并且通常他仅仅被用来排序——我们不使用相关度进行排序,也就没有计算这个数值的必要了。如果你依然要计算,你可以设置track_score参数是true。
默认的排序:作为一种快捷方式,你可以指定字段的名字进行排序:
"sort":"number_of_children"
字段会默认按照升序排序,_score按照降序排序。
multi-level sorting
也许,我们要求使用_score和date进行合并排序,首先按照date进行时间上的排序,然后按照相关度进行排序:
GET /_search
{
"query":{
"filtered":{
"query": {"match":{"tweet":"manage text search"}},
"filter":{"term":{"user_id":2}}
}
},
"sort":[
{"date": {"order":"desc"}},
{"_score":{"order":"desc"}}
]
}
顺序是重要的,结果将会按照第一个标准进行排序。只有当第一个顺序是相同的才按照第二个标准排序。依次进行。
多级排序没有调用_score——你可以使用不同的字段进行排序,例如根据地理位置的远近或使用脚本计算的自定义的值。
Sorting and query string search
Query String搜索也是支持自定义排序的,在请求URL中使用sort参数:
GET /_search?sort=date:desc&sort=_score&q=search
sorting on multi-value fields
当要对拥有多个值的field进行排序时,要知道,这些值没有固定的顺序——一个多个值的field就是对值打包。那么你选择哪一个进行排序呢?
对于number和date,你可以减少一个多值字段使用的最小值,最大值,平均值或总和排序方式单个值。例如,你可以在排序多值中的每个日期字段中的最早日期:
"sort":{
"dates":{
"order":"asc",
"mode": "min"
}
}
原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_sorting.html

浙公网安备 33010602011771号