solr 相关度评分,自定义评分

ps:临时写的,大体的实现和简单版, 以后会不断完善 博客和 代码

github:https://github.com/Eric-ly/solr_engine

solr是基于lucene的全文检索 搜索引擎,和一般查数据库相比,solr的一个特色就是它的相关度评分。 这里介绍一下它的自定义 相关度评分。

solr的评分是需要考虑很多因素的 有一个公式,比如会考虑 一句话中 关键字出现的频率,一片文章中关键字出现的频率和这篇文章的长度 来综合计算相关度评分。

在实际的业务中,可能不需要这么复杂的相关度,是需要简单粗暴的 按照我指定的规则计算相关度,并按照相关度进行排序。使用默认的话 因为因素过多 (比如分数小数太多) 可能不能让评分按照我自己的方式计算(最后分数)即最后的分数会有差别。

需求问题,比如:

我只想要 滑雪 加10分 然后我根据标题包含滑雪的排序

1.标题 含滑雪 > 标题 不含 滑雪

2.正文含滑雪 >正文不含滑雪

3.文章的质量分 高大于 低

这个时候如果用默认的 我无法 在滑雪中根据正文包含 或者 质量分进行二层,三层排序, 因为 条件1 (标题中包含 滑雪关键字的 )的评分 就不一样 导致 排序结果 从一开始就是错误的

所以我需要一个按照我自己定义的规则计算的相关度评分。

这里我大概介绍一下 如何自定义自己的相关度评分

solr使用的默认相关度是 DefaultSimilarity 类,

1.这里我们重写DefaultSimilarityFactory , 获取自定义的similarity

public class BootSimilarityFactory extends SimilarityFactory {
    @Override
    public Similarity getSimilarity(){
        return new  BootSimilarity();
    }
}
复制代码

2.BootSimilarity 中simScorer方法 只是用很少的 因素

    @Override
    public SimScorer simScorer(SimWeight weight, LeafReaderContext context) throws IOException {
        BoostSimWeight boostSimWeight = (BoostSimWeight)weight;
        return new BoostSimScorer(boostSimWeight);
    }
复制代码

BootSimScorer 方法,这里我们可以看到explain 方法 我只是使用了boostSimWeight.boost 分数,而对比 默认方法我们就会发现

    public class BoostSimScorer extends SimScorer{

略
        @Override
        public Explanation explain(int doc, Explanation freq) {
            return Explanation.match(
                    boostSimWeight.boost,
                    "(boost is:" + boostSimWeight.boost + " )",
                    Collections.singleton(freq));
        }

略
    }
复制代码

如下是默认的评分:

DefaultSimilarity 继承TFIDFSimilarity 类,具体方法由TFIDFSimilarity实现。

TFIDFSimilarity 类:
    public final SimWeight computeWeight(float queryBoost, CollectionStatistics collectionStats, TermStatistics... termStats) {
        Explanation idf = termStats.length == 1 ? this.idfExplain(collectionStats, termStats[0]) : this.idfExplain(collectionStats, termStats);
        return new TFIDFSimilarity.IDFStats(collectionStats.field(), idf, queryBoost);
    }
复制代码

其中的内部类simScore的explain方法

private final class TFIDFSimScorer extends SimScorer {
略
 public Explanation explain(int doc, Explanation freq) {
      return TFIDFSimilarity.this.explainScore(doc, freq, this.stats, this.norms);
 }
复制代码

这个方法太长 我就给大家截图展示下。

大家会发现这里面有很多的计算方法。

加之前的效果图片:

加完之后的效果图片

转载于:https://juejin.im/post/5a3ce9e7f265da43294e3e91

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Solr基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎 课程特点毕业后接触的第一个中间件就是Solr,在工作中用处广泛,为了便于大家快速掌握该技能,开始录制相关课程,该专栏特点如下:1.采用Solr最新版本视频录制,全网最新课程(Solr8.1于2019年5月16日发布)2.技能点全网最全,会结合工作经验,项目中用到的技能点都会有所涉及,更新章节比较全面3.适用范围广,从零基础到高级架构以及分布式集群都涵盖,适用初级、高级、项目实战等多个层次开发者4.多种维度辅助学习,采用独立solr粉丝群辅助教学,学员问题会及时得到解决,程序员突破圈 打卡制度,督促学员学习关注后再购买、 关注后再购买、 关注后再购买课程能得到什么1.快速学习到最新版本的全文检索技术,从视频、文章、圈子、粉丝交流等快速促进学习2.通过该技术,获得面试进阶指导3.结交人脉(庞大的粉丝群)..End初期学员100人,价格不会太高,也是为了帮助更多的开发者但是个人精力有限,所以限制条件如下1.求知欲强,有想向技术更深一层了解的2.乐于交流,喜欢探讨技术者3.学习惰性者慎入,购买后会督促大家学习,购买不是目的,学习到该技能才是该专栏的主要目的正式进入学习状态了吗,专栏群见。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值