solr搜索打分规制排序 - 白强 - ITeye技术网站

Solr内改变打分规则有几种形式:

1.配置solr的solrconfig.xml中edismax,来改变Boost打分规则

2.在solr的schema中增加一个字段,该字段专门用于排序

3.自写一个solr的评分规则。

一般简单的应用1和2就能满足。

举一个例子,电商类网站(比如淘宝)的商品搜索:

1.在商品名称上出现搜索关键字排序靠前,而内容的次之

2.对多皇冠的买家排序靠前等

3.对近期发布的商品排序靠前

4.对最近销售多商品靠前

综上获得一个综合排名

在solrconfig.xml的SearchHandler中如下配置

 

Xml代码   收藏代码
  1. <requestHandler name="standard" class="solr.StandardRequestHandler" default="true" >  
  2.     <lst name="defaults">  
  3.         <str name="echoParams">explicit</str>  
  4.         <str name="rows">10</str>  
  5.         <str name="hl">on</str>  
  6.         <str name="hl.fl">name,content</str>  
  7.         <str name="f.content.hl.fragsize">200</str>  
  8.         <str name="defType">edismax</str>  
  9.         <str name="bf">  
  10.             sum(recip(ms(NOW,pub_date),1,1,100),div(point,5632000),div(sale_count,1000000))  
  11.         </str>         
  12.         <str name="pf">  
  13.             content  
  14.         </str>         
  15.         <str name="qf">  
  16.             name^1.9   
  17.         </str>  
  18.     </lst>  
  19. </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

 

阅读全文……

你可能感兴趣的:(java,Lucene,search)