本文主要结合一个业务需求,记录一下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 functionquery函数查询功能强大,但字符串函数比较缺乏,该示例是contain示例,表示值中包含传入的字符串即返回1 否则返回0,可用于solr查询中如果某个字段包含动态传入的值在排名优先。有其他查询排序需求...
solr评分 solr自定义评分组件demo.zip
自定义的Solr 分词器,可以通过竖线"|"来分词,可以在博客http://blog.csdn.net/jiangchao858/article/details/68954044看到生成过程与使用步骤。
基于solr-geo空间搜索 1、Solr的schema.xml配置 定义坐标field 2、Solr的data-config.xml配置 建立索引 3、java查询语法 坐标距离、分页、排序
Solr实现电扇站内搜索Solr实现电扇站内搜索Solr实现电扇站内搜索Solr实现电扇站内搜索
Dubbo+Solr+RabbitMQ实现Solr数据同步
《解密搜索引擎技术实战》第八章代码,用solr实现的搜索引擎。
使用Solr实现电商网站中商品信息搜索功能。 1、 可以根据关键字搜索商品信息 2、 可以根据商品分类、价格过滤搜索结果 3、 可以根据价格进行排序 4、 实现分页
最近因为工作的需要,要做一个分词器,通过查找相关的资料最终用solr实现了,下面这篇文章主要给大家介绍了关于Solr通过特殊字符分词实现自定义分词器的相关资料,需要的朋友可以参考借鉴,下面随着小编来一起看看吧...
solr.warsolr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包...
资源名称:相关性搜索 利用Solr与Elasticsearch创建智能应用内容简介:《相关性搜索:利用Solr与Elasticsearch创建智能应用》揭开了相关性搜索的神秘面纱,告诉大家如何将 Elasticsearch与 Solr这样的搜索引擎作为可...
solr评分
基于SSM框架+solr搜索框架实现的校园二手交易平台源码+数据库 平台开发使用的技术有: 后台:spirng,springmvc,mybaits, 前台:angularjs+bootstrap。 权限控制:shiro 搜索引擎:solr 分布式搜索引擎。 数据库:...
solr
基于Solr的分布式实时搜索模型研究与实现
Apache Solr lucene 搜索模块设计实现 Solr 模块 架构 lucene 搜索
毕业设计-基于mysql和solr采用phantomjs实现网页内容爬虫