在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公衆號進行關注。