轉載 http://www.colorfuldays.org/program/solr/solr_edismax_boost/
使用Solr搭建搜尋引擎很容易,但是如何制定合理的打分規則(boost)做排序卻是一個很頭痛的事情。Solr本身的排序打分規則是繼承自Lucene的文本相關度的打分即boost,這一套演算法對於通用的提供全文檢索索引的服務來講,已經夠用了,但是對於一些專門領域的搜尋來講,文本相關度的打分是不合適的。
如何來定製適合自身業務的排序打分規則(boost)呢?經過這段時間的思考與實踐,想到了如下三個方法
- 1、定製Lucene的boost演算法,加入自己希望的商務規則;
- 2、使用Solr的edismax實現的方法,通過bf查詢配置來影響boost打分。
- 3、在建索引的schema時設定一個欄位做排序欄位,通過它來影響文檔的總體boost打分。
上面每一種方法都有其優劣,下面分析一下各自的優劣。
- 第一種方法技術難度要求較高,需要讀懂Lucene的boost打分演算法,在代碼層做定製.
- 第二種方式就簡單不少,不過因為受限於edismax提供的方法,所以有些局限性。
- 第三種排序可完全消除文本相關性打分的影響,文本檢索匹配邏輯只負責打到匹配的項,排序由自訂欄位處理。
下面結合最近使用Solr的實踐,著重介紹一下通過使用Solr的DisMaxQParserPlugin通過配置來制定結果文檔打分規則。
DisMaxQParserPlugin提供在針對文本boost打分上,支援搜尋多個schema索引欄位,並針對每一個欄位設定不同的boost許可權。
pf查詢 與 qf查詢
pf: 可提供對一條記錄的多個欄位做匹配的功能
qf: 針對查詢的每個欄位設定不同的boost權重打分,其設定的欄位必須為在pf中配置的項。
可在solrconfig.xml中的browse中配置做如下配置:
<requestHandler name="/browse" class="solr.SearchHandler">
<lst name="defaults">
<str name="defType">edismax</str>
<str name="pf">
name info title
</str>
<str name="qf">
name^1 info^0.8 title^0.6
</str>
</lst>
</requestHandler>
上面一段的意思是,查詢name,info,title三個欄位,每個欄位的文本相關度打分分別為1,0.8,0.6。計算查詢出的每一條結果的權重方法如下:分別計算各欄位的文本打分然後乘於配置的系統,最後三者相加即為該結果的boost得分。
bf查詢
除去pf查詢,qf查詢之外,仍然希望索引記錄的其它欄位能夠計入打分中,這時可以使用bf查詢。bf查詢支援一些資料函數,這些函數可作用在索引記錄的欄位上,多為時間,數值等欄位。同樣bf也支援添加權重。下面是一個使用bf查詢配置的例子:
<requestHandler name="/browse" class="solr.SearchHandler">
<lst name="defaults">
<str name="defType">edismax</str>
<str name="bf">
sum(recip(ms(NOW,created_time),3.16e-11,1,1),sqrt(log(max(sales,1))),sqrt(log(count)))^10
</str>
<str name="pf">
name info title
</str>
<str name="qf">
name^1 info^0.8 title^0.6
</str>
</lst>
</requestHandler>
其中sum,recip,ms,sqrt,log,max這些都是Solr提供的數學方法,支援的所有數學方法可在這裡尋找到:http://wiki.apache.org/solr/FunctionQuery
edismax相關資源:http://wiki.apache.org/solr/DisMaxQParserPlugin