查詢重新排序
查詢重新排序允許您執行一個簡單查詢 (A) 來比對文件,然後使用更複雜查詢 (B) 的分數來重新排序前 N 個文件。
由於來自查詢 B 的較耗費成本的排序僅應用於前 N 個文件,因此與單獨使用複雜查詢 B 相比,對效能的影響較小。權衡之處在於,使用簡單查詢 A 得分非常低的文件可能不會在重新排序階段中考慮,即使它們使用查詢 B 會得到非常高的分數。
指定排序查詢
可以使用 rq
請求參數指定排序查詢。 rq
參數必須指定一個查詢字串,該字串在剖析時會產生 RankQuery。
Solr 發行版目前包含三個排序查詢。您也可以設定您已撰寫的自訂 QParserPlugin,但大多數使用者可以直接使用 Solr 提供的剖析器。
剖析器 | QParserPlugin 類別 |
---|---|
rerank |
|
xport |
|
ltr |
LTRQParserPlugin |
重新排序查詢剖析器
rerank
剖析器會包裝由本機參數指定的查詢,以及其他參數,指出應重新排序的文件數量,以及應如何計算最終分數
reRankQuery
-
必要
預設:無
複雜排序查詢的查詢字串 - 在大多數情況下,變數將用於參考另一個請求參數。
reRankDocs
-
選用
預設:
200
應重新排序的原始查詢中前 N 個文件的數量。此數字將被視為最小值,並且可能會在內部自動增加,以便對足夠的文件進行排序以滿足查詢(即 start+rows)。
reRankWeight
-
選用
預設:
2.0
在與原始分數合併之前,將應用於每個頂層比對文件的 reRankQuery 分數的乘法因子。
reRankScale
-
選用
預設值:
none
將重新排序的分數縮放至最小值和最大值之間。此參數值的格式為
min-max
,其中 min 和 max 是正整數。例如,reRankScale=0-1
會將重新排序的分數縮放至 0 和 1 之間。 reRankMainScale
-
選用
預設值:
none
將主要查詢的分數縮放至最小值和最大值之間。此參數值的格式為
min-max
,其中 min 和 max 是正整數。例如,reRankMainScale=0-1
會將主要查詢的分數縮放至 0 和 1 之間。 reRankOperator
-
選用
預設值:
add
預設情況下,來自 reRankQuery 的分數乘以
reRankWeight
後會加到原始分數上。
在下面的範例中,使用預設的 add
行為,與查詢 "greetings" 匹配的前 1000 個文件將會使用查詢 "(hi hello hey hiya)" 重新排序。這 1000 個文件中每一個的結果分數將會是他們從 "(hi hello hey hiya)" 獲得的分數乘以 3,再加上來自原始 "greetings" 查詢的分數。
q=greetings&rq={!rerank reRankQuery=$rqq reRankDocs=1000 reRankWeight=3}&rqq=(hi+hello+hey+hiya)
如果文件與原始查詢匹配,但不與重新排序查詢匹配,則文件的原始分數將保持不變。
將 reRankOperator
設定為 multiply
會將這三個數字相乘。這意味著其他相乘運算,例如 eDisMax boost
函數 可以轉換為重新排序操作。
在下面的範例中,與查詢 "phone" 匹配的前 1000 個文件的分數將會乘以 price
欄位的一個函數。
q=phone&rq={!rerank reRankQuery=$rqq reRankDocs=1000 reRankWeight=1 reRankOperator=multiply}&rqq={!func v=div(1,sum(1,price))}
將 reRankOperator
設定為 replace
將會取代分數,因此最終分數可以獨立於文件的原始分數。
在下面的範例中,與查詢 "phone" 匹配的前 1000 個文件的分數將會被 price
欄位的一個函數取代。
q=phone&rq={!rerank reRankQuery=$rqq reRankDocs=1000 reRankWeight=1 reRankOperator=replace}&rqq={!func v=div(1,sum(1,price))}
LTR 查詢解析器
ltr
代表 Learning To Rank(學習排序),詳細資訊請參閱學習排序。