默认的,结果返回根据相关性排序,在这一节中,我们解释如何利用相关性,以及它是怎么计算的.我们以参数sort开始,以及如何使用它.
1. 排序
以便根据相关性进行排序,我们需要把相关性表述为值,在ES中,相关性评分是单浮点类型的数值,它以_score被显示在搜索结果中,默认的是降序排列.
然而有时候,你不需要一个有意义的相关性评分,例如接下来的查询,只返回字段user_id有值1的所有文档.
GET /_search
{
"query" : {
"bool" : {
"filter" : {
"term" : {
"user_id" : 1
}
}
}
}
}
在这里没有一个有意义的评分,因为我们使用一个过滤器,我们只想得到user_id:1的文档,不关心其相关性,文档以有效的随机顺序被返回,每个文档有一个0的分数.
注意,如果以为逻辑原因,对于评分为0不适当,可以使用constant_score查询:
GET /_search
{
"query" : {
"constant_score" : {
"filter" : {
"term" : {
"user_id" : 1
}
}
}
}
}
这会应用一个常数分数给所有的文档,默认值为1,它与上边的bool查询性能一致,所有的文档同样被随机返回,只不过文档的分数为1,而不是0.
根据字段值排序:
我们很有可能根据文档的时间最近程度来排序,可以使用sort参数:
GET /_search
{
"query" : {
"bool" : {
"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 ]
},
...
}
_score值没有计算,因为没有用它来排序,date字段被解释为毫秒,被返回在sort字段中.
第一点,在每个结果中,我们得到一个新的元素sort,它包含用作排序的值,在这里我们使用日期进行排序,日期被转化为毫秒单位.
第二点,_score和max_score都为null值,计算分数score可以说是非常昂贵的,通常仅被用作排序,我们不通过分数排序,所以没必要计算分数.
如果无论怎样.你都想计算分数,可以使用track_scores参数为true.
作为简写,你可以仅指定排序字段的名字:
"sort": "date"
字段将会以默认升序的方式排列,而_score是按降序的排列.
多级排序multilevel sorting
也许我们想在一个请求中,组合date和_score两个共同排序,结果首先按照date排序,再按照相关性排序.
GET /_search
{
"query" : {
"bool" : {
"must": { "match": { "tweet": "manage text search" }},
"filter" : { "term" : { "user_id" : 2 }}
}
},
"sort": [
{ "date": { "order": "desc" }},
{ "_score": { "order": "desc" }}
]
}
排序是重要的,结果首先按照第一个要素排序,在第一个要素排序结果之上,再进行第二个结果的排序.
多级排序没必要一定指定_score进行排序,你可以指定多个字段进行排序.
查询字符串搜索也可以通过sort参数指定排序:
GET /_search?sort=date:desc&sort=_score&q=search
对多值字段排序
当对于不止一个值的字段进行排序时,这些值是没有一个内在顺序的,多值字段仅仅是一个数值集,我们该选择哪一个值进行排序呢?
对于数值和日期,你可以通过使用min,max,avg,sum来使多个值变为单个值.例如,对于多值字段dates,你可以使用最早的日期进行排序:
"sort": {
"dates": {
"order": "asc",
"mode": "min"
}
}
2.字符串排序和多字段
分析的字符串字段也是一个多值字段,但是对他们排序很少能得到你想要的结果.如果你分析一个字符串"fine old art",得到三个词term,你可能想按照字母表的顺序依次依据第一个,第二个,第三个词排序,但是在排序时,ES是得不到这些信息的.
当然你可以使用min或max模式来排序(默认是按照min),但是它依据art或者old排序,而不是我们所期望的那样.