排序(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

posted @ 2014-06-09 16:42  QQ1350995917  Views(367)  Comments(0)    收藏  举报