`
粟谷_sugu
  • 浏览: 26152 次
社区版块
存档分类
最新评论

solr利用functionQuery实现根据距离远近的自定义评分

    博客分类:
  • solr
阅读更多
本文主要结合一个业务需求,记录一下solr中一个functionQuery的用法。
需求
简要说明一下业务需求。在店铺搜索时,要根据查询的坐标值与店铺的距离以及每个店铺所打出的权重字段做自定义排序。排序规则为:以查询坐标为圆心,划分半径分别为5km,10km,15km的三个环,在每个环内按照权重字段的分值进行排序,并优先显示半径小的环内的店铺,即5公里内的店铺全部优先于10公里内的店铺,10公里内的店铺全部优先于15公里内的店铺。
代码设计
参考文章http://qindongliang.iteye.com/blog/2297814中function query的介绍
引用

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

参考上述链接,而且在solr中有一个既有的类叫GeoDistValueSourceParser,用于将给定的经纬度,计算搜索结果的经纬度距离,进行排序。经过百岁的提示,可以用组合模式,将其返回的距离直接得到,只需在返回分数的方法中加入我们的业务逻辑即可。
项目的uml图如下:
1:自定义一个MyValueSourceParser类继承自GeoDistValueSourceParser,在parse方法中,得到基类返回的ValueSource,并作为参数传入我们自己定义的MyValueSource中
 @Override
    public ValueSource parse(FunctionQParser fp) throws SyntaxError {
        /**得到ValueSource为计算得到的两个坐标点之间的距离*/
        ValueSource valueSource = super.parse(fp);
        if( !(valueSource instanceof HaversineConstFunction)){
            throw new IllegalStateException("instance type must be HaversineConstFunction,but now is " + valueSource.getClass());
        }
        return new ShopMultiCirclesValueSource((HaversineConstFunction) valueSource, params);
    }

2:在自定义的MyValueSource中,在getValue方法中,先调用基类返回的ValueSource的getValue方法,将返回的FunctionValue作为参数传入自定义的MyFunctionValue中
@Override
    public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
        FunctionValues functionValues = valuesource.getValues(context, readerContext);
        final NumericDocValues weightDcoValue = DocValues.getNumeric(readerContext.reader(),params.weightField);
        ShopMultiCirclesFunctionValue shopMultiCirclesFunctionValue = new ShopMultiCirclesFunctionValue
                (this,functionValues,weightDcoValue,params);
        return shopMultiCirclesFunctionValue;
    }

3:在自定义的MyFunctionValue中,在doubleVal方法中,确定我们自定义的评分逻辑即可。
/**利用得到的距离,做三个环的距离评分,再用得到的距离分加上权重,作为最后的得分*/
    @Override
    public double doubleVal(int doc) {
        Double distance = functionValues.doubleVal(doc);
        double weight = (double) weightDocValues.get(doc);
        double x = (distance >= 0 && distance <= params.firstCircle) ? FIRST_CIRCLE_SCORE : (distance > params
                .firstCircle   && distance <= params.secondCircle) ? SECOND_CIRCLE_SCORE : (distance > params
                .secondCircle && distance <= params.thirdCircle) ? THIRD_CIRCLE_SCORE : OUTSIDE_CIRCLE_SCORE;

        double finalScore = x + weight;
        log.info("the score details:id " + doc
                + " weight " + weight
                + " distance " + distance
                + " x " + x
                + " final score " + finalScore);
        return finalScore;
    }

4:最后要再solrconfig.xml中注册我们的组件
<valueSourceParser name="distScore" class="com.dfire.tis.solrextend.valuesourceparser.ShopMultiCirclesGeoDIstValueSourceParser" >
<lst name="params">
<int name="firstCircle">5</int>
<int name="secondCircle">10</int>
<int name="thirdCircle">15</int>
<str name="weightField">period_score</str>
</lst>
</valueSourceParser>

分享到:
评论

相关推荐

    solr实现电商自定义打分

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

    solr自定义评分组件demo.zip

    在"solr自定义评分组件demo.zip"这个压缩包中,包含了一个示例项目,用于演示如何在Solr中实现自定义评分组件。主要文件有两个:`pom.xml`和`src`。 `pom.xml`是Maven项目的配置文件,它定义了项目依赖和构建设置。...

    solr functionquery自定义函数contain示例

    solr functionquery函数查询功能强大,但字符串函数比较缺乏,该示例是contain示例,表示值中包含传入的字符串即返回1 否则返回0,可用于solr查询中如果某个字段包含动态传入的值在排名优先。有其他查询排序需求...

    自定义Solr分词器

    自定义的Solr 分词器,可以通过竖线"|"来分词,可以在博客http://blog.csdn.net/jiangchao858/article/details/68954044看到生成过程与使用步骤。

    solr实现京东搜索

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

    基于java-solr-geo空间坐标搜索、距离排序、分页

    基于solr-geo空间搜索 1、Solr的schema.xml配置 定义坐标field 2、Solr的data-config.xml配置 建立索引 3、java查询语法 坐标距离、分页、排序

    solr开发维护参考

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

    solr实现的搜索引擎

    本章我们将深入探讨Solr如何实现搜索引擎,并结合《解密搜索引擎技术实战》第八章的代码实例进行详细解析。 1. **Solr的基本架构** Solr的核心架构包括索引、查询和处理三个主要部分。索引部分负责将数据转换为可...

    相关性搜索利用Solr与Elasticsearch创建智能应用

    资源名称:相关性搜索 利用Solr与Elasticsearch创建智能应用内容简介:《相关性搜索:利用Solr与Elasticsearch创建智能应用》揭开了相关性搜索的神秘面纱,告诉大家如何将 Elasticsearch与 Solr这样的搜索引擎作为可...

    Solr实现电扇站内搜索

    Solr实现电扇站内搜索Solr实现电扇站内搜索Solr实现电扇站内搜索Solr实现电扇站内搜索

    solr-6.2.0源码

    5. 自定义排序和评分:用户可以自定义文档排序规则和评分算法,以满足特定的业务需求。 6. 多语言支持:Solr内置了多种语言分析器,支持不同语言的全文搜索。 7. 高亮显示:Solr可以高亮显示搜索结果中的关键词,...

    Apache Solr(solr-8.11.1.zip)

    Apache Solr是一款开源的企业级搜索平台,由Apache软件基金会维护。它是基于Java的,提供了高效、可扩展的全文检索、数据分析和分布式搜索功能。...通过下载并解压"solr-8.11.1.zip",用户可以开始探索和利用这些功能。

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

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

    Solr通过特殊字符分词实现自定义分词器详解

    《Solr自定义分词器实现特殊字符分词详解》 在信息检索和文本分析领域,分词是至关重要的步骤,它将原始文本拆分成可处理的词汇单元。Apache Solr,作为流行的全文搜索引擎,提供了丰富的分词工具,但有时默认的...

    solr4.9.0.zip

    1. **快速全文检索**:Solr利用倒排索引技术,实现对文本内容的快速检索。倒排索引将每个文档中出现的词与文档ID关联,使得在查询时能够迅速定位到包含特定词的文档。 2. **多字段搜索**:Solr允许用户在多个字段上...

    基于Solr的多表join查询加速方法

    - **BitQuery.java**:这可能是一个自定义查询实现,用于在Solr中执行高效的位运算,用于处理大量的文档筛选。位运算在大数据集上可以提供比常规查询更快的速度,尤其是在处理join场景时,可以通过位向量表示相关...

    Dubbo+Solr+RabbitMQ实现Solr数据同步 DataSyncParent.zip

    本项目“Dubbo+Solr+RabbitMQ实现Solr数据同步”结合了三个核心组件,以构建一个可靠的分布式数据同步解决方案。以下是关于这些技术的详细解释: **Dubbo** Dubbo是一款高性能、轻量级的Java开源远程服务调用框架,...

    solr-4.10.3

    同时,Solr提供插件机制,用户可以自定义查询解析器、过滤器、请求处理器等,实现功能扩展。 10. **监控与管理**:SolrAdmin是Solr内置的Web界面,用于监控和管理Solr实例,包括查看统计信息、加载和删除索引、测试...

Global site tag (gtag.js) - Google Analytics