solr搜索打分规制排序 - 白强 - ITeye技术网站
Solr内改变打分规则有几种形式:
1.配置solr的solrconfig.xml中edismax,来改变Boost打分规则
2.在solr的schema中增加一个字段,该字段专门用于排序
3.自写一个solr的评分规则。
一般简单的应用1和2就能满足。
举一个例子,电商类网站(比如淘宝)的商品搜索:
1.在商品名称上出现搜索关键字排序靠前,而内容的次之
2.对多皇冠的买家排序靠前等
3.对近期发布的商品排序靠前
4.对最近销售多商品靠前
综上获得一个综合排名
在solrconfig.xml的SearchHandler中如下配置
- <requestHandler name="standard" class="solr.StandardRequestHandler" default="true" >
- <lst name="defaults">
- <str name="echoParams">explicit</str>
- <str name="rows">10</str>
- <str name="hl">on</str>
- <str name="hl.fl">name,content</str>
- <str name="f.content.hl.fragsize">200</str>
- <str name="defType">edismax</str>
- <str name="bf">
- sum(recip(ms(NOW,pub_date),1,1,100),div(point,5632000),div(sale_count,1000000))
- </str>
- <str name="pf">
- content
- </str>
- <str name="qf">
- name^1.9
- </str>
- </lst>
- </requestHandler>
bf用函数计算某个字段的权重,如上例子中pub_date发布日期的权重,point比如诚信指数,sale_count销售数量
bf内字段必须是索引的,bf的函数查看solr api文档 http://wiki.apache.org/solr/FunctionQuery
pf查询字段,这样在schema不用制定默认字段
qf对默认查询增加权重比值,比如标题是content的1.9倍,值越大权重越大
这样查询就会计算如下的一个综合评分值了
Solr自定义排序:http://www.cnblogs.com/HD/p/4023960.html
加入一个查询Handler到solrconfig.xml的<config/>当中:
<requestHandler name="/browse" class="solr.SearchHandler" default="true" > <lst name="defaults"> <str name="defType">edismax</str> <str name="bf"> sum(linear(vip,1000,0),linear(sqrt(log(linear(point,1,2))),100,0),sqrt(log(ms(createTime)))) </str> <!--<str name="pf"> searchText </str> <str name="qf"> subject^1 content^0.8 </str>--> </lst> </requestHandler>
说明:
a)上面的default="true"意思为设置为默认的查询handler(记得把原standard中的default="true"删除掉)
b)见已经被注释的这段:
<!--<str name="pf"> searchText </str> <str name="qf"> subject^1 content^0.8 </str>-->
这是简单的不使用bf的排序加权方式,可以用于应付简单的排序,具体pf/qf的使用,可以上网上搜搜应用。这里演示的功能相对“复杂”,不适用它。
c)见这句公式:
sum(linear(vip,1000,0),linear(sqrt(log(linear(point,1,2))),100,0),sqrt(log(ms(createTime))))
公式中的函数定义和意思,可以参考:
官方文档:
http://wiki.apache.org/solr/FunctionQuery
中文说明:
http://mxsfengg.iteye.com/blog/352191
这里的函数意思是:
- 如果是vip信息=值+1000,非vip信息=值+0
- 点击率(point)的值范围为:50~500之间
- 发布时间(createTime)值范围为:50以内
以上三个值相加得出最统权重分从高到低排序
排序自定义函数参考:
http://mxsfengg.iteye.com/blog/352191