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