ES學習記錄9--請求體搜尋--Rescoring
阿新 • • 發佈:2018-12-21
Rescoring
再評分機制通過將query
和post_filter
關鍵詞返回來的前一部分文件資料(比如前100-500個文件)進行重新排序可以提高精確度,這個過程中使用的是次要演算法(通常次要演算法耗費的資源會更多),所以只是將它用於前部分文件的再排序行為中,而不是應用於索引中所有的文件排序中。
再評分rescore
請求會在每個碎片返回由處理整個搜尋請求的節點排序後的結果返回之前執行,目前rescore
只有一個介面實現——查詢再評分機制,使用查詢來調整評分,將來的版本中可能會有其他的再評分機制,比如成對的再評分。
查詢再評分機制
查詢再評分僅僅會在前一部分返回的資料中執行,每個碎片上檢查的文件數可以使用window_size
_score
,原始查詢和rescore
查詢的相對重要性可以使用query_weight
和rescore_query_weight
引數進行指定,兩個引數預設都為1。下面是一個小栗子:
curl -X POST "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query" : {
"match" : {
"message" : {
"operator" : "or",
"query" : "the quick brown"
}
}
},
"rescore" : {
// 指定每個碎片上檢查的文件數量
"window_size" : 50,
"query" : {
"rescore_query" : {
"match_phrase" : {
"message" : {
"query" : "the quick brown",
"slop" : 2
}
}
},
// 原始查詢的比重
"query_weight" : 0.7,
// 再評分的比重
"rescore_query_weight" : 1.2
}
}
}
'
評分組合的機制可以使用score_mode
引數控制,有如下的引數可選:
total
:新增原始的分數和查詢再評分的分數,這也是預設模式;multiply
:原始分數乘以查詢再評分的分數,對於查詢資源的函式很管用;avg
:取原始得分和再評分查詢分數得平均數;max
:取原始得分和再評分得分中較大的那個分數;min
:取原始得分和再評分得分中較小的那個分數;
多次再評分
上述是單一的再評分,也可以按序執行多個再評分的操作,如:
curl -X POST "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query" : {
"match" : {
"message" : {
"operator" : "or",
"query" : "the quick brown"
}
}
},
"rescore" : [ {
"window_size" : 100,
"query" : {
"rescore_query" : {
"match_phrase" : {
"message" : {
"query" : "the quick brown",
"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": {
"source": "Math.log10(doc.likes.value + 2)"
}
}
}
}
}
} ]
}
'
第一步是先獲取查詢的結果,第二步再獲取第一步的結果,以此類推…第二步中的再評分將會看到第一步中再評分排序執行完畢,因此可以將會在第一次的再評分(rescore
)過程中為了第二次的再評分(rescore
)使用一個大的window
去把文件拉取到一個較小的window
中。