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

Solr基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎 课程特点毕业后接触的第一个中间件就是Solr,在工作中用处广泛,为了便于大家快速掌握该技能,开始录制相关课程,该专栏特点如下:1.采用Solr最新版本视频录制,全网最新课程(Solr8.1于2019年5月16日发布)2.技能点全网最全,会结合工作经验,项目中用到的技能点都会有所涉及,更新章节比较全面3.适用范围广,从零基础到高级架构以及分布式集群都涵盖,适用初级、高级、项目实战等多个层次开发者4.多种维度辅助学习,采用独立solr粉丝群辅助教学,学员问题会及时得到解决,程序员突破圈 打卡制度,督促学员学习关注后再购买、 关注后再购买、 关注后再购买课程能得到什么1.快速学习到最新版本的全文检索技术,从视频、文章、圈子、粉丝交流等快速促进学习2.通过该技术,获得面试进阶指导3.结交人脉(庞大的粉丝群)..End初期学员100人,价格不会太高,也是为了帮助更多的开发者但是个人精力有限,所以限制条件如下1.求知欲强,有想向技术更深一层了解的2.乐于交流,喜欢探讨技术者3.学习惰性者慎入,购买后会督促大家学习,购买不是目的,学习到该技能才是该专栏的主要目的正式进入学习状态了吗,专栏群见。
Solr是一个基于Java的搜索引擎,可以用Java实现自定义排序。以下是实现自定义排序的步骤: 1. 创建一个自定义排序器类,实现org.apache.solr.search.SortComparator。 2. 在自定义排序器类中实现compare方法,该方法接收两个参数,即要比较的文档对象。 3. 在compare方法中实现自定义排序逻辑,根据需要将文档对象进行排序。 4. 在solrconfig.xml文件中配置自定义排序器,将其添加到fieldType中。 5. 在查询请求中指定使用自定义排序器。 下面是一个示例代码,演示了如何使用Java实现自定义排序器: ```java public class CustomSortComparator extends SortComparator { @Override public int compare(SortField sortField, SchemaField schemaField, FieldComparator<?> fieldComparator1, FieldComparator<?> fieldComparator2) throws IOException { // 获取要比较的文档对象 Object value1 = fieldComparator1.value(sortField.getReverse()); Object value2 = fieldComparator2.value(sortField.getReverse()); // 根据自定义逻辑进行排序 if (value1 instanceof Long && value2 instanceof Long) { Long long1 = (Long) value1; Long long2 = (Long) value2; if (long1 > long2) { return sortField.getReverse() ? -1 : 1; } else if (long1 < long2) { return sortField.getReverse() ? 1 : -1; } else { return 0; } } // 默认情况下,按照Solr默认的排序逻辑进行排序 return super.compare(sortField, schemaField, fieldComparator1, fieldComparator2); } } ``` 在solrconfig.xml文件中配置自定义排序器: ```xml <fieldType name="text_custom" class="solr.TextField"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> </analyzer> <sortComparator class="com.example.CustomSortComparator"/> </fieldType> ``` 在查询请求中指定使用自定义排序器: ```sh http://localhost:8983/solr/mycore/select?q=*:*&sort=custom_field+desc&fl=field1,field2&defType=edismax&wt=json ``` 以上代码演示了如何使用Java实现自定义排序器,通过实现compare方法自定义排序逻辑,将自定义排序器添加到fieldType中,在查询请求中指定使用自定义排序器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值