ElasticSearch--排序和相关

Posted 準提童子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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排序,而不是我们所期望的那样.


以上是关于ElasticSearch--排序和相关的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch-排序

ElasticSearch-排序

小烨收藏ElasticSearch权威指南-排序与相关性

Elasticsearch 优先排序较短/不太相关的标题

ElasticSearch 聚合 - 排序值

elasticsearch相关性打分背后的理论