需求:

1、需求:调整排序算法改为综合得分排名

2、规则:

①搜索方式:先过滤,后排序

②搜索字段:用户昵称

③匹配方式:分词完全匹配

④排序按照综合得分高低进行排序展示

综合得分=

达人得分(权重:单独计算)

+粉丝数得分(权重:75%)

+基础得分(权重:25%)

a.达人得分

在搜索结果中置顶展示,其中优先开通美店达人

b.粉丝数得分

粉丝数越多,权重越高(需要开发相应算法计算相对值)

c.基础得分

上传过头像、修改过签名(不重复计算)

实现思路:
设置最大权重值,每个用户按照各自条件计算相应的得分数(最小最大规范化也叫离差标准化)
是达人时再加上最大权重(置顶效果)当达人有美店时再次加上最大权重(置顶中的置顶)
为什么可以这么做?因为要求先过滤后进行排序,既当符合搜索条件后,排序再单独进行计算
完全不需要考虑查询过程中的匹配而产生的权重.

实现:

/*** Copyright (C) 2015-2020 gome meixin_search Inc.All Rights Reserved.* * FileName:UserWeightCalculator.java** Description:简要描述本文件的内容** History:* 版本号           作者                  日期               简要介绍相关操作*  1.0  liuyuxin  2016年4月13日**/
package cn.com.mx.gome.flash.similarity;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import cn.com.mx.gome.flash.constant.Const;
import cn.com.mx.gome.flash.entity.EcpUser;
import cn.com.mx.gome.flash.load.ConfigCenter;
import cn.com.mx.gome.flash.util.PropUtil;
import cn.com.mx.gome.search.core.weight.WeightAlgorithm;
import cn.com.mx.gome.search.core.weight.WeightCalculator;/*** **/
@Component("userWeightCalculator")
public class UserWeightCalculator implements WeightCalculator<EcpUser>, InitializingBean {private static final Logger logger = LoggerFactory.getLogger(UserWeightCalculator.class);private String defaultUserPic = null;/*** 假设的权重总分,最大粉丝数;这俩数变了,得重建索引*/public Double maxUserScore = PropUtil.getInstance().getDouble(Const.WEIGHT_USER_MAX, 100000),maxFollowerCount = PropUtil.getInstance().getDouble(Const.WEIGHT_USER_FOLLOWER_MAX, 5000);/** (non-Javadoc)* * @see* cn.com.mx.gome.search.core.weight.WeightCalculator#calculate(java.lang* .Object)*/@Overridepublic Double calculate(EcpUser t) {double score = 0;boolean hasPic = t.getUserPic() != null&& !(t.getUserPic().equals(defaultUserPic) && !(t.getUserPic().equalsIgnoreCase("null")));// 有头像boolean hasUserSign = t.getUser_sign() != null && t.getUser_sign().length() > 0&& !(t.getUser_sign().equalsIgnoreCase("null"));// 有签名// 签名和头像占25%权重if (hasPic)score += (maxUserScore * 0.25) / 2;if (hasUserSign)score += (maxUserScore * 0.25) / 2;// 粉丝数,占75%权重if (t.getFollowerCount() != null && t.getFollowerCount() > 0)score += WeightAlgorithm.normalization(t.getFollowerCount().doubleValue(), 0.0, maxFollowerCount, 0.0,maxUserScore * 0.75);boolean isVIP = t.getStatus() == Const.USER_STATUS_V;boolean hasShop = t.getType() == Const.USER_TYPE_HASSHOP;// 达人置顶if (isVIP) {score += maxUserScore;// 优先美店if (hasShop)score += maxUserScore;}t.setWeight(score);return score;}/** (non-Javadoc)* * @see* org.springframework.beans.factory.InitializingBean#afterPropertiesSet()*/@Overridepublic void afterPropertiesSet() throws Exception {defaultUserPic = configCenter.get("user.logo.default");logger.info("default user pic path= , {}", defaultUserPic);}@Autowiredprivate ConfigCenter configCenter;
}

算法:

/*** Copyright (C) 2015-2020 gome meixin_search Inc.All Rights Reserved.* * FileName:WeightAlgorithm.java** Description:简要描述本文件的内容** History:* 版本号           作者                  日期               简要介绍相关操作*  1.0  **/
package cn.com.mx.gome.search.core.weight;/*** @author **/
public class WeightAlgorithm {/*** * @描述:最小最大规范化也叫离差标准化 ,可以对原始数据进行线性变换 ; 假定min和max是最小值和最大值,*                    v是该区间中的一个值,将其映射到新的区间[newMin, newMax]中为v' 则有: v' =*                    (v-Min)/(max-min)*(newMax-newMin)+newMin*                    这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。* @param v*            做标准化的样本数据* @param min*            样本数据最小值* @param max*            样本数据最大值* @param newMin*            新的映射区间最小值* @param newMax*            新的映射区间最大值* @return* @return double* @exception* @createTime:2016年4月8日* @author: liuyuxin*/public static Double normalization(Double v, Double min, Double max, Double newMin, Double newMax) {return (v - min) / (max - min) * (newMax - newMin) + newMin;}}

solr入门之自定义排序之构建自己的权重计算方法及相应的排序字段相关推荐

  1. Android基础入门教程——2.4.7 构建一个可复用的自定义BaseAdapter

    Android基础入门教程--2.4.7 构建一个可复用的自定义BaseAdapter 标签(空格分隔): Android基础入门教程 本节引言: 如题,本节给大家带来的是构建一个可复用的自定义Bas ...

  2. Apache Solr入门教程

    转自:http://blog.csdn.net/u011936655/article/details/51960005 Apache Solr入门教程(初学者之旅) 写在前面:本文涉及solr入门的各 ...

  3. 从入门到放弃,.net构建博客系统(二):依赖注入

    文章目录:<从入门到放弃,.net构建博客系统> 从入门到放弃,.net构建博客系统(一):系统构建 从入门到放弃,.net构建博客系统(二):依赖注入 上一篇中有讲到项目启动时会进行io ...

  4. grunt从入门到自定义项目模板

    文章还可在我的github上找到,排版更友好一点:grunt从入门到自定义项目模板 一.Grunt入门介绍 1. Grunt是神马 基于任务的命令行构建工具(针对JavaScript项目) 链接:ht ...

  5. Android Studio新手–下载安装配置–零基础入门–基本使用–调试技能–构建项目基础–使用AS应对常规应用开发

    转自:http://blog.csdn.net/yanbober/article/details/45306483 目标:Android Studio新手–>下载安装配置–>零基础入门–& ...

  6. Web 函数自定义镜像实战:构建图象处理函数

    Web 函数自定义镜像实战:构建图象处理函数 本篇文章写作于 2021.07.23 前言 作为一名前端工程师,我们经常会在 H5, 或者小程序中,使用 Canvas 来处理或生成图片. 不过在有些禁用 ...

  7. android arrayadapter自定义,Android零基础入门|自定义ArrayAdapter

    原标题:Android零基础入门|自定义ArrayAdapter ListView用起来还是比较简单的,也是Android应用程序中最重要的一个组件,但其他ListView可以随你所愿,能够完成很多想 ...

  8. android 自定义录像机,android-camera2 - 将自定义捕获请求构建器选项设置为使用Camera2 API捕获图像以使用OpenCV库进行摄像机校准 - 堆栈内存溢出...

    我们正在使用Camera2 API捕获N张图像,而未设置任何自定义捕获请求构建器选项. 我们正在使用这些图像通过OpenCV Android库411进行相机校准. 然后,我们正在使用OpenCV An ...

  9. Apache Solr入门教程(初学者之旅)

    2019独角兽企业重金招聘Python工程师标准>>> 写在前面:本文涉及solr入门的各方面,请逐行阅读,相信能帮助你对solr有个清晰全面的了解并能简单实用. 在Apache S ...

最新文章

  1. mobile former测试
  2. 关于VC++控制台输出中文乱码的问题
  3. BASIC-2 01字串
  4. 记录工作中第一次解决bug的小事
  5. wsadata wsadata;为什么不通过_注册公司之公司名称核准,知道为什么你的核名一直不通过吗?...
  6. js设计模式——3.观察者模式
  7. JAVASCIPT实现WEB SERVER的问题
  8. .Net中的设计模式——Strategy模式
  9. 组态软件mcgs入库mysql_昆仑通态专题(四):MCGS嵌入版组态软件的数据报表
  10. 图书借阅与图书管理系统的设计与实现,源码+论文。
  11. jzxx1105 【入门】字符图形4-星号正三角
  12. 采用QT进行OpenGL开发(三)着色器编程
  13. python环境下使用opencv把视频切割成图片
  14. 【三次集训】Day1思维题题解报告
  15. spring boot + Spring Security 入门
  16. python Flask 10 Flask请求上下文管理werkzeug
  17. Python解析页面国家码
  18. python 操作ps脚本_python – 有没有办法以编程方式获得ps输出?
  19. mac如何查看是否安装了git?
  20. ajax post提交多个参数后台controller @RequestParam方式接收

热门文章

  1. nodeJS web端包使用 bower 管理
  2. 用Python3开发爆款游戏——捕鱼达人
  3. 淘宝刷流量软软件,互刷点击量,直通车点击系统【胖虎图图-互点专家】
  4. Linux 系统资源查看和定时任务
  5. 使用Pull解析XML获取新浪新闻
  6. Qt设置label的文字自动换行、高度随内容调整、上下可滚动
  7. 【硬件控制】5. Pico使用串口与电脑通信
  8. 极客日报第 44 期:北大拟开设人工智能班,朱松纯教授领衔;网传富士康向拜腾汽车投资两亿美元,拜腾目前无法给出回应
  9. 机器学习--线性回归模型(LinearRegression)
  10. Linux应用开发4 如何获取系统参数信息(监测终端信息)