|
@@ -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);
|