文档章节

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

zmf
 zmf
发布于 2014/11/14 14:20
字数 863
阅读 381
收藏 0

http://www.colorfuldays.org/program/solr/solr_edismax_boost/

使用Solr搭建搜索引擎很容易,但是如何制定合理的打分规则(boost)做排序却是一个很头痛的事情。Solr本身的排序打分规则是继承自Lucene的文本相关度的打分即boost,这一套算法对于通用的提供全文检索的服务来讲,已经够用了,但是对于一些专门领域的搜索来讲,文本相关度的打分是不合适的。
如何来定制适合自身业务的排序打分规则(boost)呢?经过这段时间的思考与实践,想到了如下三个方法

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

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

  • 3、在建索引的schema时设置一个字段做排序字段,通过它来影响文档的总体boost打分。

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

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

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

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

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


© 著作权归作者所有

zmf

zmf

粉丝 16
博文 63
码字总数 106711
作品 0
朝阳
程序员
私信 提问
solr:关于spell的优化效果

一、lucene里边,有三个算法去计算拼写纠错的相似度。 1、Edit Distance(编辑距离) 算法原理:从一个字符串A经过增删改的步数,变成另外一个字符串B,这个步数最少的时候,就是为A与B之前的...

momoHuang
2013/08/30
632
0
php调用Solr中的数据问题

@momoHuang 你好,想跟你请教个问题:关于Solr排序的问题, 最终的排序打分,可以根据 bf打分与 lucene的sorce 相加,得到最后打分,在php中我可以获取到score数据,但是怎么让score值参与排序...

ShoringChow
2014/12/10
194
0
solr:关于dismax的使用情况

首先说说 dismax这个功能,它是基于lucene的DisjunctionMaxQuery去 扩展的,就是说,实际上用到的就是DisjunctionMaxQuery的这个查询类。查询api,可以知道是 对查询的几个域中,取最大的打分...

momoHuang
2013/07/18
9.3K
3
Solr 迟到的Payloads

[TOC] -- 没有了,但你还有我啊! 1. What is this? Payload在Lucene中表述是一个任意 byte[],它可以(只是可以不是必须)为它每个Term存储额外的信息到倒排索引里面。而且这些Payloads可以...

大明搜索
2017/10/23
41
0
Lucene打分规则与Similarity模块详解

搜索排序结果的控制 Lucnen作为搜索引擎中,应用最为广泛和成功的开源框架,它对搜索结果的排序,有一套十分完整的机制来控制;但我们控制搜索结果排序的目的永远只有一个,那就是信息过滤,...

Breath_L
2012/03/27
14.1K
2

没有更多内容

加载失败,请刷新页面

加载更多

聊聊nacos config的deleteConfig

序 本文主要研究一下nacos config的deleteConfig ConfigController nacos-1.1.3/config/src/main/java/com/alibaba/nacos/config/server/controller/ConfigController.java @Controller@Re......

go4it
昨天
3
0
面试:原来Redis的五种数据类型底层结构是这样的

关注我,可以获取最新知识、经典面试题以及微服务技术分享   在Redis中会涉及很多数据结构,比如SDS,双向链表、字典、压缩列表、整数集合等等。Redis会基于这些数据结构自定义一个对象系统...

ccww_
昨天
4
0
java发送html模板的高逼格邮件

最近做了一个监测k8s服务pod水平伸缩发送邮件的功能(当pod的cpu/内存达到指定阈值后会水平扩展出多个pod、或者指定时间内pod数应扩展到指定数量),一开始写了个格式很low的邮件,像下面这样...

码农实战
昨天
10
0
php-fpm配置文件详解/MariaDB密码重置、慢查询日志

来源:https://blog.csdn.net/Powerful_Fy php-fpm主配置文件路径:/usr/local/php-fpm/etc/php-fpm.conf #位于安装php安装目录下的etc/目录中,该文件中最后一行将配置文件指向:include=/...

asnfuy
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部