如何控制评分

如果设置了sort字段,那么将会按照sort字段的顺序返回结果。

如果没有设置sort字段,那么将会根据相关度打分来排序。也就是说,相关度更高的排在前面。

如何来定制适合自身业务的排序打分规则(boost)呢?经过这段时间的思考与实践,想到了如下三个方法:
1、定制Lucene的boost算法,加入自己希望的业务规则;
2、使用Solr的edismax实现的方法,通过bf查询配置来影响boost打分。
3、在建索引的schema时设置一个字段做排序字段,通过它来影响文档的总体boost打分。

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

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

第二种方式就简单不少,不过因为受限于edismax提供的方法,所以有些局限性。

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

下面重点看edismax的使用:

edismax的理念:

edismax中将查询字段和查询词项分开了,如我们在标准用法中使用name:zjf,那么在edismax中,需要在qf中设置查询字段为name,然后在q中输入zjf,注意这里不能加name了,否则没有结果。

这样设计的结果就是,查询词项会去所有的qf列(query
field,可以设置多列,也可以配置为每列配置权重)上进行查询,如果要针对每个字段有不同的查询,如name:zjf,age:30,那么需要将其中一个移入到fq中,但是注意,fq中的查询是不影响评分的。这也是edismax的理念。满足常用的搜索场景。

edismax的常用参数:

q和fq来自标准查询,也经常使用。

edismax扩展的有:

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

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

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

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

edismax列子,以下来自网络

例子1,来自网络。

下面结合最近使用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

sum

Solr1.3 sum(x,y,...) 返回多个函数的和。

recip

recip(x,m,a,b)实现a/(m * x + b)的互逆函数。 m,a,b是常数,x是任何数字字段或任意复杂的函数。

当a和b相等,x> = 0时,该函数的最大值为1,随x增加而下降。
将a和b的值增加在一起导致整个功能的移动到曲线的较平坦部分。
这些属性可以使这成为在x是rord(datefield)时提升更新文档的理想功能。

max

max(x,c) returns the max of another function and a constant. Useful for "bottoming out" another function at some constant.

log

Solr1.3 log(x) returns log base 10 of the function x.
返回函数x的log10。

sqrt

Solr1.3 sqrt(x) returns the square root of the function x返回函数x的平方根

例子2,来自http://www.xuebuyuan.com/323380.html

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

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>

div

Solr1.3 div(x,y) divides the function x by the function y.

ms

Solr1.4

Returns milliseconds of difference between it's arguments.

Dates are relative to the Unix or POSIX time epoch, midnight, January 1, 1970 UTC.

Arguments
may be numerically indexed date fields such as TrieDate (recommended
field type for dates since Solr 1.4), or date math (examples in
SolrQuerySyntax) based on a constant date or NOW.

Things other than these will _not_ work as arguments. For example, you cannot currently use:

Arguments may _not_ be "classic" date fields

ms()

ms(a)

Note that this number can be negative for dates from before the epoch.

ms(a,b)

bf用函数计算某个字段的权重,如上例子中pub_date发布日期的权重,point比如诚信指数,sale_count销售数量

bf内字段必须是索引的,bf的函数查看solr api文档 http://wiki.apache.org/solr/FunctionQuery

pf查询字段,这样在schema不用制定默认字段

qf对默认查询增加权重比值,比如标题是content的1.9倍,值越大权重越大

这样查询就会计算如下的一个综合评分值了

solr 使用edismax来控制评分的更多相关文章

  1. solr 的edismax与dismax比较与分析

    edismax支持boost函数与score相乘作为,而dismax只能使用bf作用效果是相加,所以在处理多个维度排序时,score其实也应该是其中一个维度 ,用相加的方式处理调整麻烦. 而disma ...

  2. solr入门之权重排序方法初探之使用edismax改变权重

    做搜索引擎避免不了排序问题,当排序没有要求时,solr有自己的排序打分机制及sorce字段 1.无特殊排序要求时,根据查询相关度来进行排序(solr自身规则) 2.当涉及到一个字段来进行相关度排序时, ...

  3. ElasticSearch 评分排序

    背景 通过脚本改变评分 背景 近期有一个需求,需要对优惠券可用商品列表加个排序,只针对面值类的券不包括折扣券. 需求是这样的,假设有一张面值券 50 块钱,可用商品列表 A 100.B 40.C 10 ...

  4. Solr搜索的排序打分规则探讨

    使用Solr搭建搜索引擎很容易,但是如何制定合理的打分规则(boost)做排序却是一个很头痛的事情.Solr本身的排序打分规则是继承自Lucene的文本相关度的打分即boost,这一套算法对于通用的提 ...

  5. Solr打分排序规则自定义【转】

    在搭建好solrCloud搜索集群后,通过编写基本的查询显示语句已经能够通过输入关键字查询到相应结果进行显示,但是在显示结果排序上以及不相关信息过滤问题上,如何制定合理的打分规则得到理想的结果集确实比 ...

  6. 原创:史上对BM25模型最全面最深刻的解读以及lucene排序深入讲解

    垂直搜索结果的优化包括对搜索结果的控制和排序优化两方面,其中排序又是重中之重.本文将全面深入探讨垂直搜索的排序模型的演化过程,最后推导出BM25模型的排序.然后将演示如何修改lucene的排序源代码, ...

  7. discuz学习,文件列表

    文件颜色说明: 红色:程序核心文件,修改这类文件时千万要注意安全! 橙色:做插件几乎不会用到的文件,大概了解功能就可以了,其实我也不推荐修改这些文件 绿色:函数类文件,许多功能强大的自定义函数可以调用 ...

  8. 开发DZ插件教程

    插件制作的基本思路是:(初学者适用)1.形成插件思路2.制作插件界面3.构架程序模块4.搭建存储数据5.填充功能语句6.检查应用错误7.完善插件功能 前言:为方便互联网数万Discuz!爱好者,更加深 ...

  9. discuz论坛目录功能详解

    在某处收集来的discuz目录资料,二次开发挺有用的.记录下.(基于7.0的标准程序,部分与插件无关的文件不作说明) 文件颜色说明: 红色:程序核心文件,修改这类文件时千万要注意安全! 橙色:做插件几 ...

随机推荐

  1. redmine和jenkins的ldap登录设置

    工具: softeera LDAP browser 流程: Authentication modes » test Name * Host * Port *  LDAPS Account Passwo ...

  2. 获取docker容器的ip地址

    1.进入容器后执行cat /etc/hosts 会显示自己以及(– link)软连接的容器IP 2.使用命令 docker inspect --format '{{ .NetworkSettings. ...

  3. log4j.properties配置说明学习网址

    https://blog.csdn.net/wangzhaotongalex/article/details/51308802

  4. OpenCV几种访问cv::Mat数据的方法

    一般来说,如果是遍历数据的话用指针ptr比用at要快.特别是在debug版本下.因为debug中,OpenCV会对at中的坐标检查是否有溢出,这是非常耗时的. 代码如下 #include <op ...

  5. 负载均衡器 Ribbion

    一.客户端负载均衡器 Ribbon 客户端向服务器如Eureka Server拉取已经注册的服务信息,然后根据负载均衡策略, 直接命中哪一台服务器发送请求. 整个过程在客户端完成,不需要服务器的参与. ...

  6. 文件如何转换成pdf或html格式

    1.使用jacob插件 2.使用方法 1)于word.ppt等上传文件转换为PDF格式文件的环境搭建,步骤如下:① 首先电脑要先安装office软件(不可以是WPS软件)② 需要把jacob.dll文 ...

  7. error: C++ preprocessor "/lib/cpp" fails sanity check错误解决方法

    error: C++ preprocessor "/lib/cpp" fails sanity check 问题的解决 问题的根源是缺少必要的C++库.如果是CentOS系统,运行 ...

  8. awk 文本处理工具

    awk: 强大的文本处理工具,擅长对日志文件进行分析: 不仅用于Linux,也是任何环境中现在的功能最强大的数据处理引擎: 语法说明: awk '{pattern + action}' {filena ...

  9. 在linux下使用am335x的DMA

    [本文首发于cnblogs,作者:byeyear,Email:east3@163.com] 这几天在弄am3358的DMA,简化应用环境如下: am3358的FSMC接了一片FPGA: FPGA上接A ...

  10. Zuul Read Time out 错误

    只改application.yml文件即可: eureka: client: serviceUrl: defaultZone: http://localhost:7087/eureka/ server ...