Solr搜索的排序打分規則探討


轉載 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM