`
qindongliang1922
  • 浏览: 2183705 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117524
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125921
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59896
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71300
社区版块
存档分类
最新评论

如何实现Solr自定义评分查询

阅读更多


(一)背景介绍

大多数时候我们使用lucene/solr/elasticsearch自带的评分查询都是没问题的,当然这也仅仅限于简单的业务或者对搜索排名
不敏感的场景中,假设业务方要求有若干业务因子要干扰到排名,同时还不能放弃框架本身的文本相似度评分,那么应该怎么做呢?
这种场景尤其是在电商类的一些垂直搜索中体现比较明显,比如,新商品加分,口碑好的加分,图片清晰的加分,商品介绍详细的加分,大促的商品加分等等等等,那么如何把众多的业务因素加到的总的评分里面?

(二)实现策略

(1)在索引的时候把众多的业务评分计算提前计算好,存储成一个字段,然后查询的时候根据这个字段排名。
评价:比较简单暴力,适合加权固定,不经常改变评分因素的业务使用,查询性能最高  ,更新,改变,调试评分比较麻烦

(2)在索引的时候把众多的业务评分因子都索引成一个字段,在查询的时候动态获取各个字段评分计算后,加入总的评分从而影响最终的排名。
评价:对动态更改评分支持比较好,查询性能稍差

(3)对于业务的评分因素,动静分离,静态评分因子长期不变的,就全部计算完存储成一个字段,动态的也存储若干字段,最终的评分由静态业务评分+动态业务评分+相似度评分综合得出,从而影响最终的排名。
评价:合理规划评分因素,动静分离,算是业务与技术的一个折中


有关lucene的自定义评分组件,可以参考以前的文章:
http://qindongliang.iteye.com/blog/2008672

下面来简述下如何在solr中,实现开发自定义评分组件,solr基于lucene,总体来说
与lucene大同小异,需要自己开发几个包装的类即可,在elasticsearch中也是如此,后面有机会,再探讨在elasticsearch中自定义评分的实现

(三)实现方式

(A)通过重写QueryParser实现

1,继承CustomScoreProvider类,重写customScore方法,从DocValues中动态读取评分有关因子,计算后,影响总评分
2,继承CustomScoreQuery类,重写getCustomScoreProvider方法,需要用到1,返回自定义的CustomScoreProvider类
到此,在lucene中就完事了,但是在solr中我们还需要继续
3,继承QParser类,重写parse方法,需要用到2,并在构造方法中,完成一些必须的初始化操作
4,继承QParserPlugin类,重写createParser方法,需要用到3,至此,代码完成
打包项目成一个jar,拷贝至server\solr-webapp\webapp\WEB-INF\lib中
5,在solrconfig.xml中,注册我们写的插件:

<queryParser name="myqp" class="com.easy.custom.queryparser.MyQueryParserPlugin">
  <lst name="words">
       <str name="word">easy_money</str>
       <str name="word">easy_count</str>
       <str name="word">easy_test</str>
     </lst>
</queryParser>


6, 重启solr,或者reload指定的core
7,打开solr的ui页面,指定defType,测试搜索,如果log不报错,就证明使用成功了





(B)通过Function Query实现

函数查询一项强大的功能,solr已经自带了
许多的函数,比如数学函数,聚合函数等,详细资料可看官网的wiki资料
https://cwiki.apache.org/confluence/display/solr/Function+Queries

1,继承ValueSource类,重写getValues方法,并在返回的方法中,完成评分计算逻辑
2,继承ValueSourceParser类,并重写parser方法,返回1定义的类,
建议在parser方法里面,获取ValueSource然后传入自定义的ValueSource类里面复用,
不建议直接从DocValues里面读取,因为基于这个IndexSearch的打开的ValueSource耗费资源更少。至此,代码完成打包项目成一个jar,拷贝至server\solr-webapp\webapp\WEB-INF\lib中
3,在solrconfig.xml中,注册我们的组件:

//此处,也可也定义需要传入的参数
<valueSourceParser name="myfunc" class="com.easy.custom.function.MyValueParser"  />   



4,打开solr的ui页面进行查询,不报错的话,即查询成功,可以看到和我们第一种方式的结果是一致的



(四)总结

其实核心功能还是使用lucene实现的,solr/es则是在lucene的基础上提供了强大灵活的插件机制,这样以来,我们就能更容易实现一些我们特殊需求的定制化。

全部代码,已经放在github上:
https://github.com/qindongliang/solr-custom-score




有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。
技术债不能欠,健康债更不能欠, 求道之路,我们同行。


  • 大小: 35.9 KB
  • 大小: 38.8 KB
0
1
分享到:
评论
2 楼 qindongliang1922 2016-09-26  
chucklee 写道
defType使用edismax,通过boost查询,和文中的方式有什么区别呢,没太理解文中自己要实现的部分具体是什么内容。
个人认为:计算出来各个业务因子的得分之后,存储在各个字段中,通过solr自己提供的函数写一个公式,查询的时候指定公式给boost是不是就可以了呢

如果得分,是查询时候动态生成的,你怎么做
1 楼 chucklee 2016-09-26  
defType使用edismax,通过boost查询,和文中的方式有什么区别呢,没太理解文中自己要实现的部分具体是什么内容。
个人认为:计算出来各个业务因子的得分之后,存储在各个字段中,通过solr自己提供的函数写一个公式,查询的时候指定公式给boost是不是就可以了呢

相关推荐

    solr实现电商自定义打分

    本篇文章将详细介绍如何利用Solr实现电商自定义打分机制。 首先,我们需要了解Solr的评分(Score)机制。Solr的默认评分是基于TF-IDF(词频-逆文档频率)算法的,它会根据查询词在文档中的出现频率和在整个索引中的...

    solr自定义评分组件demo.zip

    下面将详细探讨Solr自定义评分组件及其在"solr自定义评分组件demo.zip"中的应用。 首先,我们需要理解Solr的评分机制。在Solr中,每个匹配查询的文档都会有一个评分(relevance score),这是基于Lucene的TF-IDF...

    solr实现京东搜索

    除了基本功能,Solr还可以实现如拼音搜索、同义词扩展、高亮显示搜索结果、相关性评分等高级特性,进一步提升用户体验。例如,通过添加拼音分析器,用户可以用汉字拼音进行搜索;利用Solr的自定义相似度函数,可以...

    Solr 查询,索引

    3. **查询优化**:Solr会根据查询条件和索引结构自动优化查询计划,包括使用倒排索引来快速定位匹配文档,以及对查询结果进行评分排序。 4. **高亮显示**:Solr能够对查询结果中的匹配词进行高亮,提高用户查找相关...

    solr-6.2.0源码

    4. 高级搜索功能:Solr提供丰富的查询语法,如布尔逻辑、短语匹配、模糊匹配、字段限制等,以及自定义查询解析器和过滤器。 5. 自定义排序和评分:用户可以自定义文档排序规则和评分算法,以满足特定的业务需求。 6....

    Solr-Plugins:Solr 的各种插件

    默认的Standard Query Parser可以处理标准的Lucene语法,但通过编写自定义插件,我们可以实现更复杂的查询逻辑,例如支持自然语言查询、地理位置查询等。 2. **分词器插件**: 分词器决定了如何将文档内容拆分成...

    solr开发维护参考

    同时,可以通过修改TF-IDF评分模型或者实现自定义评分函数来调整搜索结果的排名。 7. **分布式搜索**(SolrCloud):SolrCloud是Solr的分布式解决方案,支持集群部署、自动复制和故障转移。理解ZooKeeper的角色以及...

    solr教程+实例

    4.3 高级查询:使用函数查询、评分、过滤器、聚合等功能,实现复杂的查询需求。 4.4 集成到Web应用:通过SolrJ Java客户端库或RESTful API将Solr集成到Web应用程序中。 五、SolrCloud与分布式搜索 5.1 ZooKeeper...

    SOLR的应用教程

    Solr提供丰富的查询语法,包括布尔运算、短语匹配、范围查询等,还支持自定义查询解析器和函数查询,以实现复杂的查询逻辑。 1.2.4 核心 在Solr中,每个独立的搜索服务实例被称为一个“核心”(Core),每个核心...

    solr4.3源代码一

    例如,你可以创建新的语言分析器,优化查询性能,或者实现特定的评分策略。 总的来说,研究Solr4.3的源代码能让你深入理解全文搜索的工作原理,掌握如何利用Solr和Lucene来构建高性能的搜索应用。同时,对于解决...

    solr-dataimport-scheduler.jar 可使用于solr7.x版本

    Solr能够对大量数据进行快速的全文检索,同时支持多字段排序、分面搜索和自定义评分策略。为了保持索引与源数据的一致性,Solr引入了DIH,这是一个内建的机制,用于从关系数据库、XML文件等外部数据源导入数据,并将...

    solr-7.2.1

    相关度计算通常基于TF-IDF算法,但也可以自定义评分函数。 9. **高亮显示**:Solr 能够突出显示查询结果中与查询词匹配的部分,帮助用户快速定位关键信息。 10. **多语言支持**:Solr 内置多种语言的分词器和过滤...

    最新版linux solr-8.5.2.tgz

    5. 自定义评分:用户可以自定义文档的相关性评分算法,优化搜索结果。 二、安装与配置 Solr 8.5.2 on Linux 1. 下载:首先从 Apache 官方网站下载最新版的 solr-8.5.2.tgz 文件。 2. 解压:使用 `tar -zxvf solr-...

    solr导航搜索工具+文档+配置代码

    5. 自定义排序和评分:用户可以根据需求定制排序规则和评分机制,提升搜索结果的相关性。 6. 多语言支持:Solr内置了多种语言的分词器,能够处理多种语言的搜索请求。 二、Solr的基本架构 Solr架构主要由以下组件...

    SOLR的学习资料

    你也可以自定义评分函数,或者按其他字段进行排序。 3. **分布式搜索**:SOLR云(SolrCloud)提供了分布式部署和自动复制,以实现高可用性和水平扩展。 4. **实时搜索**:SOLR的实时索引功能允许在不重启服务的...

    solr4.6.0 源代码

    Solr的查询解析器位于`org.apache.solr.search`包中,如`QParser`接口和其实现,将用户的查询字符串转换为内部查询对象。`SolrQueryParser`是标准的查询解析器,处理布尔运算符、字段限制和通配符查询。执行查询时...

    solr深入浅出

    搜索则涉及查询解析、评分和结果返回。Solr的源码结构清晰,包括目录结构、Solr Home配置等,便于理解和开发扩展。 在部署和配置上,Solr可以与Tomcat等应用服务器集成。安装过程中需注意版本选择,以及验证安装...

    solr各种最近的jar包

    查询解析器负责将用户的输入转化为Solr可以理解的查询语言,而排序机制则允许用户根据特定字段或评分对搜索结果进行排序。 2. **Solr服务器**:Solr服务器是运行Solr应用的载体,通常使用Jetty或Tomcat等Web服务器...

Global site tag (gtag.js) - Google Analytics