Elasticsearch 2.20 从新评分

thetwit98 9年前

来自: http://my.oschina.net/secisland/blog/614867


    在Elasticsearch中,搜索单个单词是比较快的,当搜索短语的时候,效率会比较低。所以Elasticsearch提供了从新评分的方法来提高效率。他的原理主要是当在整个索引中搜索短语消耗的资源会比较多,但大多数时候,人们只关注最近发生一部分文档,所以可以先在最近的一段文档中先对短语进行从新评分,然后再查询,这个时候看起来效率会增加很多。

    在返回搜索请求节点处理排序结果之前在每个分片上执行从新评分。通常情况下当我们用从新评分API来重新评分的过程只执行一次,在未来有可能会被调整。当search_type为 scan或者count的时候将不被执行。在用分页查询的时候,每一页查询的时候window_size尽量不要修改,如果修改了可能会引起排序的混乱,导致不可预知的结果。查询评分时在query或者post_filter返回的top-k结果,在每个分片返回文档的数量有window_size控制,默认返回from到size的个数。

    默认情况下对每个文档最终的得分(_score) 是原始的得分和从新评分后的得分进行线性组合后的结果。原始评分和从新评分的比例关系分布由query_weight 和rescore_query_weigh控制,默认都是1。例如从新评分查询:

请求:POST localhost:9200/_search

参数:

{     "query" : {        "match" : {           "field1" : {              "operator" : "or",              "query" : "the quick brown",              "type" : "boolean"           }        }     },     "rescore" : {        "window_size" : 50,        "query" : {           "rescore_query" : {              "match" : {                 "field1" : {                    "query" : "the quick brown",                    "type" : "phrase",                    "slop" : 2                 }              }           },           "query_weight" : 0.7,           "rescore_query_weight" : 1.2        }     }  }

分数相结合的方式可以与score_mode控制:score_mode的参数有:

total:将原始分数和从新评分的分值相加,默认方式。

multiply:将原始分数和从新评分的分值相乘,对于用函数方式从新评分的时候比较有用。

avg:将原始分数和从新评分的分值进行平均。

max:在原始分数和从新评分的分值中取最大的值。

min:原始分数和从新评分的分值中取最小的值。

系统也支持顺序执行多个从新评分查询,例如:

{     "query" : {        "match" : {           "field1" : {              "operator" : "or",              "query" : "the quick brown",              "type" : "boolean"           }        }     },     "rescore" : [ {        "window_size" : 100,        "query" : {           "rescore_query" : {              "match" : {                 "field1" : {                    "query" : "the quick brown",                    "type" : "phrase",                    "slop" : 2                 }              }           },           "query_weight" : 0.7,           "rescore_query_weight" : 1.2        }     }, {        "window_size" : 10,        "query" : {           "score_mode": "multiply",           "rescore_query" : {              "function_score" : {                 "script_score": {                    "script": "log10(doc['numeric'].value + 2)"                 }              }           }        }     } ]  }

    先是第一个得到评分的结果,然后第二个评分在第一个评分的结果在此评分,第二次评分参考了第一次评分的排序结果,所以它可以用在第一从新评分结果比较多的情况下利用第二次评分得到一个较小结果文档。

    赛克蓝德(secisland)后续会逐步对Elasticsearch的最新版本的各项功能进行分析,近请期待。也欢迎加入secisland公众号进行关注