Solr评分排序机制


1      默认评分排序规则

1.1    默认评分规则

Solr是基于Lucene的,评分规则也是基于Lucene,具体详情参考“Lucene评分机制.docx”文档,

网页版http://blog.youkuaiyun.com/a822631129/article/details/78550439

1.2    排序规则

1.无特殊排序要求时,根据查询相关度(评分)来进行排序

2.指定一个或多个字段的值来进行相关度排序时,可以直接使用solr的sort功能来实现

3.对多个字段进行自定义的综合打分排序(这个应该才是重点)

2      Solr评分排序控制

2.1    控制方法

通过查询资料大概有以下几种方法:

2.1.1  修改Lucene的boost算法

定制Lucene的boost算法,加入自己希望的业务规则

2.1.2  指定字段排序

在建索引的schema时设置字段做排序字段或者查询的时候指定字段,通过它来影响文档的总体boost打分。

2.1.3  使用edismax/dismax

使用Solr的edismax/dismax实现的方法,通过bf查询配置来影响boost打分。

首先要设置defType为edismax,edismax是boost函数与原score相乘作为打分结果,dismax是相加,一般自定义打分都设置为edismax,因为score是其中一个维度(匹配度)。打分函数是设置bf字段,函数就是 query product exists等solr函数根据自定义规则计算一个打分结果的函数。将计算结果*score,搜索结果按这个最终打分来排。另外还有个参数mm,来控制匹配度,如80%,表示必须分词结果的所有词去匹配,需要80%的词匹配上。

2.2    区别

上面每一种方法都有其优劣,下面分析一下各自的优劣。

第一种方法技术难度要求较高,需要读懂Lucene的boost打分算法,在代码层做定制.

第二种排序可完全消除文本相关性打分的影响,文本检索匹配逻辑只负责打到匹配的项,排序由自定义字段处理

第三种方式就简单不少,使用edismax提供的方法,可进行些加、乘、除、平方根等等常规操作,应该基本能满足业务要求。附上edismax函数:https://lucene.apache.org/solr/guide/6_6/function-queries.html#FunctionQueries-field(官方链接)

http://mxsfengg.iteye.com/blog/352191(中文链接)

2.3    详情

2.3.1  定制Lucene的boost算法

该方案太难,可行性不高,暂不考虑

2.3.2  指定字段排序

1)       指定一个filed

有时候,我们只关心某一字段,希望返回的数据根据这一字段排序。例如,我想查找所有书籍中比较便宜的书籍。可以使用查询参数sort=price_s asc,使用如下的HTTP查询请求: 
http://localhost:8080/solr/core/select?q=*:*&sort=price_dasc

2)       指定多个filed

有时候,我希望返回的数据先按权重排序,再按某一filed排序,那么可以使用多个field来排序,此时按第一个排序参数排序,如果第一个参数不能区分顺序,则按第二个参数排序。对于某次查询,我希望先按权重排序,权重相同则按价格排序,那么,查询参数可以为sort=score desc, price asc

3)       含有函数的排序

有时候,排序规则可能需要两个filed的值做数学运算。比如,有一次排序基于两个字段的和,可以使用这样的查询参数sort=sum(x, y) desc(这里的x字段和y字段都为double类型)。

Sort函数:https://wiki.apache.org/solr/FunctionQuery#Sort_By_Function

2.3.3  使用edismax/dismax

edismax列子(来源于网络)

下面结合最近使用Solr的实践,着重介绍一下通过使用Solr的DisMaxQParserPlugin通过配置来制定结果文档打分规则。
DisMaxQParserPlugin提供在针对文本boost打分上,支持搜索多个schema索引字段,并针对每一个字段设置不同的boost权限。
pf查询 与 qf查询 
pf:
 可提供对一条记录的多个字段做匹配的功能
qf: 针对查询的每个字段设置不同的boost权重打分,其设置的字段必须为在pf中配置的项。

Xml代码  

1.	<requestHandler name="/browse" class="solr.SearchHandler">  
2.	<lst name="defaults">  
3.	<str name="defType">edismax</str>  
4.	<str name="pf">  
5.	name info title  
6.	</str>  
7.	<str name="qf">  
8.	name^1 info^0.8 title^0.6  
9.	</str>  
10.	</lst>  
11.	</requestHandler> 

 上面一段的意思是,查询name,info,title三个字段,每个字段的文本相关度打分权重分别为1,0.8,0.6。计算查询出的每一条结果的权重方法如下:分别计算各字段的文本打分然后乘于配置的权重,最后三者相加即为该结果的boost得分。

bf查询 
除去pf查询,qf查询之外,仍然希望索引记录的其它字段能够计入打分中,这时可以使用bf查询。bf查询支持一些数据函数,这些函数可作用在索引记录的字段上,多为时间,数值等字段。同样bf也支持添加权重。下面是一个使用bf查询配置的例子:

Xml代码  

<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>

 recip

       recip(x,m,a,b)=a/(m*x+b)其中,m、a、b是常量,x是变量或者一个函数。

        当a=b,并且x>=0的时候,这个函数的最大值是1,值的大小随着x的增大而减小。

        例如:recip(rord(creationDate),1,1000,1000)

 ms

  返回两个参数间毫秒级的差别

edismax的常用参数:

qfquery fieldq中的词项要在哪些字段上执行查询。可以设置多列以及每一列的权重。如果没有设置,那么将会使用df默认字段(一般在配置文件中配置好)。

pfparse fieldpfqf的格式一样。区别是pf会更加注重短语匹配,也就是说如果输入zjf xhj作为查询,那么在配置了pf的字段上,zjf随后出现xhj的文档的评分更高。注意这里只是评分更高,如果想获得更加严格的短语匹配,应该在查询中使用"zjf xhj"

ps:用于配置pf中的词项的短语间隔。可以控制zjfxhj之间多少个间隔。

bq:接受一个和q一样的查询,它和q的区别是不影响返回的结果集,只会影响排名。

bf:提升函数,通过数学公式来影响评分,而且不局限在qf中的字段。

mm:最小匹配,如果我们不严格要求AND,可以配置mm来定义查询结果集的匹配程度。

注意:想pf qf这种需要查询的字段上,一定要是indexed的。

关于mm:

mm可以设置为整数,如2,代表至少匹配两个词项,如果输入词项少于两个,那么要全部匹配才行。

mm可以设为百分比,表示必须匹配到多大的百分比才可以。也可以合并在一起匹配。

如设置为mm="2<50%" 那么如下查询的话:

solr 只有一个词项,必须全部匹配。

solr is:2个词项,也必须全部匹配。

solr is a:超过两个,按照50%来计算,只需要匹配一个词项就可以。(一个词项占33%,四舍五入到50%

solr is a serch:必须匹配两个,50%


其中sumrecipmssqrt log,max这些都是Solr提供的数学方法,支持的所有数学方法可在这里查找到:http://wiki.apache.org/solr/FunctionQuery 
edismax相关资源:http://wiki.apache.org/solr/DisMaxQParserPlugin

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunyang098

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值