在Elasticsearch中,搜索单个单词是比较快的,当搜索短语的时候,效率会比较低。因此Elasticsearch提供了重新评分的方法来提升效率。他的原理主要是当在整个索引中搜索短语消耗的资源会比较多,但大多数时候,人们只关注最近发生一部分文档,因此能够先在最近的一段文档中先对短语进行重新评分,而后再查询,这个时候看起来效率会增长不少。函数
在返回搜索请求节点处理排序结果以前在每一个分片上执行重新评分。一般状况下当咱们用重新评分API来从新评分的过程只执行一次,在将来有可能会被调整。当search_type为 scan或者count的时候将不被执行。在用分页查询的时候,每一页查询的时候window_size尽可能不要修改,若是修改了可能会引发排序的混乱,致使不可预知的结果。查询评分时在query或者post_filter返回的top-k结果,在每一个分片返回文档的数量有window_size控制,默认返回from到size的个数。post
默认状况下对每一个文档最终的得分(_score) 是原始的得分和重新评分后的得分进行线性组合后的结果。原始评分和重新评分的比例关系分布由query_weight 和rescore_query_weigh控制,默认都是1。例如重新评分查询:ui
请求:POST localhost:9200/_searchspa
参数:code
{ "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:将原始分数和重新评分的分值相乘,对于用函数方式重新评分的时候比较有用。ip
avg:将原始分数和重新评分的分值进行平均。ci
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公众号进行关注。