项目中用solr(lucene内核)来完成全文检索。项目中需求是搜索文章时,返回的结果中与搜索关键词匹配度高的要靠前,更新时间近的文章也要靠前。lucene框架有一套完善的评分公式:
coord(q,d) 评分因子,基于文档中出现查询项的个数。越多的查询项在一个文档中,说明文档的匹配程度越高。
queryNorm(q)查询的标准查询
tf(t in d) 指项t在文档d中出现的次数frequency。具体值为次数的开根号。
idf(t) 反转文档频率, 出现项t的文档数docFreq
t.getBoost 查询时候查询项加权
norm(t,d) 长度相关的加权因子
根据这个公式默认的排序就是 文档与搜索词匹配度越高,排序越靠前。要加入其他因素对排序影响,一般通过更改boost的值。Solr的edismax方式的bf查询配置就是更改boost值影响总体打分。
在solrconfig.xml中加入下面配置:
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="defType">edismax</str>
<str name="bf">
recip(ms(NOW,publishTime),3.16e-11,1,1)
</str>
<str name="pf">
</str>
<str name="qf">
</str>
</lst>
</requestHandler>
bf中的公式就是1/(ms(NOW-updateTime)*3.16e-11)+1 ,ms()是两个时间的毫秒差(详见
http://wiki.apache.org/solr/FunctionQuery)。公式中:更新时间与now相差越大,分数越小;分数在0-1之内;最近的更新时间和最远的更新时间对分数影响斜度不会太大。