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

http://www.colorfuldays.org/program/solr/solr_edismax_boost/算法

使用Solr搭建搜索引擎很容易,可是如何制定合理的打分規則(boost)作排序倒是一個很頭痛的事情。Solr自己的排序打分規則是繼承自Lucene的文本相關度的打分即boost,這一套算法對於通用的提供全文檢索的服務來說,已經夠用了,可是對於一些專門領域的搜索來說,文本相關度的打分是不合適的。
如何來定製適合自身業務的排序打分規則(boost)呢?通過這段時間的思考與實踐,想到了以下三個方法apache

  • 一、定製Lucene的boost算法,加入本身但願的業務規則;函數

  • 二、使用Solr的edismax實現的方法,經過bf查詢配置來影響boost打分。搜索引擎

  • 三、在建索引的schema時設置一個字段作排序字段,經過它來影響文檔的整體boost打分。spa

上面每一種方法都有其優劣,下面分析一下各自的優劣。orm

  • 第一種方法技術難度要求較高,須要讀懂Lucene的boost打分算法,在代碼層作定製.xml

  • 第二種方式就簡單很多,不過由於受限於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

相關文章
相關標籤/搜索