Authored by 胡古飞

新品到着默认页个性化时间维度做修改

@@ -23,6 +23,7 @@ import com.yoho.search.service.personalized.PersonalVectorFeatureSearch; @@ -23,6 +23,7 @@ import com.yoho.search.service.personalized.PersonalVectorFeatureSearch;
23 import com.yoho.search.service.personalized.PersonalizedRedisService; 23 import com.yoho.search.service.personalized.PersonalizedRedisService;
24 import com.yoho.search.service.service.SearchDynamicConfigService; 24 import com.yoho.search.service.service.SearchDynamicConfigService;
25 import com.yoho.search.service.utils.SearchRequestParams; 25 import com.yoho.search.service.utils.SearchRequestParams;
  26 +import com.yoho.search.service.vo.FirstShelveTimeScore;
26 import com.yoho.search.service.vo.PhysicalChannelScore; 27 import com.yoho.search.service.vo.PhysicalChannelScore;
27 28
28 @Component 29 @Component
@@ -39,13 +40,13 @@ public class FunctionScoreSearchHelper { @@ -39,13 +40,13 @@ public class FunctionScoreSearchHelper {
39 @Autowired 40 @Autowired
40 private PersonalizedRedisService personalizedRedisService; 41 private PersonalizedRedisService personalizedRedisService;
41 42
42 - private final float globalWeight = 0.50f;  
43 - 43 + // 普通个性化的时间维度
44 private final int oneDaySecondCount = 24 * 60 * 60; 44 private final int oneDaySecondCount = 24 * 60 * 60;
45 - private final int limitDayCount = 90;  
46 - private final int offsetDayCount = 30;  
47 - private final int scaleDayCount = 60;  
48 - 45 + private FirstShelveTimeScore commonFirstShelveTimeScore = new FirstShelveTimeScore(90,30,60);
  46 + // 新品到着的个性化时间维度
  47 + private FirstShelveTimeScore newRecShelveTimeScore = new FirstShelveTimeScore(30,10,20);
  48 + private final float globalWeight = 0.50f;
  49 +
49 private WeightBuilder genWeightFactorBuilder(float factor) { 50 private WeightBuilder genWeightFactorBuilder(float factor) {
50 return ScoreFunctionBuilders.weightFactorFunction(factor); 51 return ScoreFunctionBuilders.weightFactorFunction(factor);
51 } 52 }
@@ -60,32 +61,52 @@ public class FunctionScoreSearchHelper { @@ -60,32 +61,52 @@ public class FunctionScoreSearchHelper {
60 // 个性化搜索相关 61 // 个性化搜索相关
61 if (searchCommonHelper.isNeedPersonalSearch(paramMap)) { 62 if (searchCommonHelper.isNeedPersonalSearch(paramMap)) {
62 personalVectorFeatureSearch.addPersonalizedScriptScore(functionScoreQueryBuilder, paramMap); 63 personalVectorFeatureSearch.addPersonalizedScriptScore(functionScoreQueryBuilder, paramMap);
63 - //个性化统一添加时间规则  
64 - int todayLastSecond = DateUtil.getLastTimeSecond(new Date());  
65 - int limitSecondValue = todayLastSecond - limitDayCount * oneDaySecondCount;  
66 - int scaleSecondTime = scaleDayCount * oneDaySecondCount;  
67 - int offsetSecondValue = offsetDayCount * oneDaySecondCount;  
68 - functionScoreQueryBuilder.add(QueryBuilders.rangeQuery("firstShelveTime").lt(limitSecondValue), ScoreFunctionBuilders.weightFactorFunction(0.5f));  
69 - functionScoreQueryBuilder.add(QueryBuilders.rangeQuery("firstShelveTime").from(limitSecondValue), ScoreFunctionBuilders.linearDecayFunction("firstShelveTime",todayLastSecond,scaleSecondTime).setOffset(offsetSecondValue)); 64 + this.addFirstShelveTimeFunctionScore(functionScoreQueryBuilder, paramMap);
70 } 65 }
  66 + // 针对全球购降分
71 if (searchCommonHelper.containGlobal(paramMap)) { 67 if (searchCommonHelper.containGlobal(paramMap)) {
72 functionScoreQueryBuilder.add(QueryBuilders.termQuery("isGlobal", "Y"), genWeightFactorBuilder(globalWeight)); 68 functionScoreQueryBuilder.add(QueryBuilders.termQuery("isGlobal", "Y"), genWeightFactorBuilder(globalWeight));
73 } 69 }
74 - if (searchCommonHelper.isNeedDeScoreBrandSearch(paramMap)) {  
75 - functionScoreQueryBuilder.add(QueryBuilders.termQuery("isForbiddenSortBrand", "1"), ScoreFunctionBuilders.weightFactorFunction(0));  
76 - }  
77 - // 针对频道降分 70 + // 模糊搜索针对频道降分
78 if (searchCommonHelper.isNeedDeScoreForChannel(paramMap)) { 71 if (searchCommonHelper.isNeedDeScoreForChannel(paramMap)) {
79 List<PhysicalChannelScore> physicalChannelScores = this.getPhysicalChannelQueryBuilder(paramMap); 72 List<PhysicalChannelScore> physicalChannelScores = this.getPhysicalChannelQueryBuilder(paramMap);
80 for (PhysicalChannelScore physicalChannelScore : physicalChannelScores) { 73 for (PhysicalChannelScore physicalChannelScore : physicalChannelScores) {
81 functionScoreQueryBuilder.add(physicalChannelScore.getQueryBuilder(), ScoreFunctionBuilders.weightFactorFunction(physicalChannelScore.getWeight())); 74 functionScoreQueryBuilder.add(physicalChannelScore.getQueryBuilder(), ScoreFunctionBuilders.weightFactorFunction(physicalChannelScore.getWeight()));
82 } 75 }
83 } 76 }
  77 + // 针对屏蔽的品牌降分【目前没用】
  78 + if (searchCommonHelper.isNeedDeScoreBrandSearch(paramMap)) {
  79 + functionScoreQueryBuilder.add(QueryBuilders.termQuery("isForbiddenSortBrand", "1"), ScoreFunctionBuilders.weightFactorFunction(0));
  80 + }
84 functionScoreQueryBuilder.boostMode(CombineFunction.MULT); 81 functionScoreQueryBuilder.boostMode(CombineFunction.MULT);
85 return functionScoreQueryBuilder; 82 return functionScoreQueryBuilder;
86 } 83 }
87 84
88 /** 85 /**
  86 + * 个性化时添加时间维度的降分
  87 + *
  88 + * @param functionScoreQueryBuilder
  89 + * @param paramMap
  90 + */
  91 + private void addFirstShelveTimeFunctionScore(FunctionScoreQueryBuilder functionScoreQueryBuilder, Map<String, String> paramMap) {
  92 + if (searchCommonHelper.isNewRecPageDefault(paramMap)) {
  93 + this.addFirstShelveTimeScore(functionScoreQueryBuilder, newRecShelveTimeScore);
  94 + } else {
  95 + this.addFirstShelveTimeScore(functionScoreQueryBuilder, commonFirstShelveTimeScore);
  96 + }
  97 + }
  98 +
  99 + private void addFirstShelveTimeScore(FunctionScoreQueryBuilder functionScoreQueryBuilder, FirstShelveTimeScore firstShelveTimeScore) {
  100 + int todayLastSecond = DateUtil.getLastTimeSecond(new Date());
  101 + int limitSecondValue = todayLastSecond - firstShelveTimeScore.getLimitDayCount() * oneDaySecondCount;
  102 + int scaleSecondTime = firstShelveTimeScore.getScaleDayCount() * oneDaySecondCount;
  103 + int offsetSecondValue = firstShelveTimeScore.getOffsetDayCount() * oneDaySecondCount;
  104 + functionScoreQueryBuilder.add(QueryBuilders.rangeQuery("firstShelveTime").lt(limitSecondValue), ScoreFunctionBuilders.weightFactorFunction(0.5f));
  105 + functionScoreQueryBuilder.add(QueryBuilders.rangeQuery("firstShelveTime").from(limitSecondValue),
  106 + ScoreFunctionBuilders.linearDecayFunction("firstShelveTime", todayLastSecond, scaleSecondTime).setOffset(offsetSecondValue));
  107 + }
  108 +
  109 + /**
89 * 直接使用商品特征的向量用来做个性化打分 110 * 直接使用商品特征的向量用来做个性化打分
90 * 111 *
91 * @param queryBuilder 112 * @param queryBuilder
@@ -106,7 +127,7 @@ public class FunctionScoreSearchHelper { @@ -106,7 +127,7 @@ public class FunctionScoreSearchHelper {
106 * @param descoreGender 127 * @param descoreGender
107 * @return 128 * @return
108 */ 129 */
109 - public float getDescoreGenderWeight(String uid, float baseScore, String descoreGender) { 130 + private float getDescoreGenderWeight(String uid, float baseScore, String descoreGender) {
110 try { 131 try {
111 Map<String, Float> userGenderFloat = personalizedRedisService.getUserGenderFeature(uid); 132 Map<String, Float> userGenderFloat = personalizedRedisService.getUserGenderFeature(uid);
112 Float userGenderWeight = userGenderFloat.get(descoreGender); 133 Float userGenderWeight = userGenderFloat.get(descoreGender);
@@ -187,14 +187,14 @@ public class SearchCommonHelper { @@ -187,14 +187,14 @@ public class SearchCommonHelper {
187 } 187 }
188 188
189 /** 189 /**
190 - * 是否需要对新品到着默认页降分 190 + * 是否是新品到着默认页
191 * 191 *
192 * @param paramMap 192 * @param paramMap
193 * @return 193 * @return
194 */ 194 */
195 - public boolean isNeedDeScoreForNewArrivePage(Map<String, String> paramMap) { 195 + public boolean isNewRecPageDefault(Map<String, String> paramMap) {
196 String pageId = paramMap.get("pageId"); 196 String pageId = paramMap.get("pageId");
197 - if (!("4".equals(pageId))) { 197 + if (StringUtils.isBlank(pageId)|| !pageId.equals("4")){
198 return false; 198 return false;
199 } 199 }
200 String order = paramMap.get("order"); 200 String order = paramMap.get("order");
@@ -204,6 +204,7 @@ public class SearchCommonHelper { @@ -204,6 +204,7 @@ public class SearchCommonHelper {
204 return true; 204 return true;
205 } 205 }
206 206
  207 +
207 /** 208 /**
208 * 关键字中含性别,则加上性别的过滤条件 209 * 关键字中含性别,则加上性别的过滤条件
209 * 210 *
  1 +package com.yoho.search.service.vo;
  2 +
  3 +public class FirstShelveTimeScore {
  4 +
  5 + private int limitDayCount;
  6 + private int offsetDayCount;
  7 + private int scaleDayCount;
  8 +
  9 + public FirstShelveTimeScore(int limitDayCount, int offsetDayCount, int scaleDayCount) {
  10 + super();
  11 + this.limitDayCount = limitDayCount;
  12 + this.offsetDayCount = offsetDayCount;
  13 + this.scaleDayCount = scaleDayCount;
  14 + }
  15 +
  16 + public int getLimitDayCount() {
  17 + return limitDayCount;
  18 + }
  19 +
  20 + public int getOffsetDayCount() {
  21 + return offsetDayCount;
  22 + }
  23 +
  24 + public int getScaleDayCount() {
  25 + return scaleDayCount;
  26 + }
  27 +
  28 +}