Elasticsearch 2.20 從新評分
來自: 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公眾號進行關注。