ElasticSearch(八)--排序和相关

默认的,结果返回根据相关性排序,在这一节中,我们解释如何利用相关性,以及它是怎么计算的.我们以参数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排序,而不是我们所期望的那样.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值