Authored by hugufei

商品支持随机召回

@@ -48,22 +48,26 @@ public class SortBrandRecallRequestBuilder { @@ -48,22 +48,26 @@ public class SortBrandRecallRequestBuilder {
48 if (productCountConfig.getNewShelve() > 0) { 48 if (productCountConfig.getNewShelve() > 0) {
49 requests.add(this.buildSortBrandNewShelveRequest(paramQueryFilter, sortBrand, productCountConfig.getNewShelve(), sortBrandType)); 49 requests.add(this.buildSortBrandNewShelveRequest(paramQueryFilter, sortBrand, productCountConfig.getNewShelve(), sortBrandType));
50 } 50 }
51 - // 2) 人气  
52 - if (productCountConfig.getHeatValue() > 0) {  
53 - requests.add(this.buildSortBrandHeatValueRequest(paramQueryFilter, sortBrand, productCountConfig.getHeatValue(), sortBrandType)); 51 + // 2) 新开促销
  52 + if (productCountConfig.getPromotion() > 0) {
  53 + requests.add(this.buildSortBrandPromotionRequest(paramQueryFilter, sortBrand, productCountConfig.getPromotion(), sortBrandType));
54 } 54 }
55 // 3) 新降价 55 // 3) 新降价
56 if (productCountConfig.getReducePrice() > 0) { 56 if (productCountConfig.getReducePrice() > 0) {
57 requests.add(this.buildSortBrandReducePriceRequest(paramQueryFilter, sortBrand, productCountConfig.getReducePrice(), sortBrandType)); 57 requests.add(this.buildSortBrandReducePriceRequest(paramQueryFilter, sortBrand, productCountConfig.getReducePrice(), sortBrandType));
58 } 58 }
59 - // 4) 新开促销  
60 - if (productCountConfig.getPromotion() > 0) {  
61 - requests.add(this.buildSortBrandPromotionRequest(paramQueryFilter, sortBrand, productCountConfig.getPromotion(), sortBrandType));  
62 - }  
63 - // 5) 转化率 59 + // 4) 转化率
64 if (productCountConfig.getCtrValue() > 0) { 60 if (productCountConfig.getCtrValue() > 0) {
65 requests.add(this.buildSortBrandCtrValueRequest(paramQueryFilter, sortBrand, productCountConfig.getCtrValue(), sortBrandType)); 61 requests.add(this.buildSortBrandCtrValueRequest(paramQueryFilter, sortBrand, productCountConfig.getCtrValue(), sortBrandType));
66 } 62 }
  63 + // 5) 人气
  64 + if (productCountConfig.getHeatValue() > 0) {
  65 + requests.add(this.buildSortBrandHeatValueRequest(paramQueryFilter, sortBrand, productCountConfig.getHeatValue(), sortBrandType));
  66 + }
  67 + // 6) 随机
  68 + if (productCountConfig.getRandom() > 0) {
  69 + requests.add(this.buildSortBrandRandomRequest(paramQueryFilter, sortBrand, productCountConfig.getRandom(), sortBrandType));
  70 + }
67 } 71 }
68 return requests; 72 return requests;
69 } 73 }
@@ -80,67 +84,80 @@ public class SortBrandRecallRequestBuilder { @@ -80,67 +84,80 @@ public class SortBrandRecallRequestBuilder {
80 } 84 }
81 85
82 /** 86 /**
83 - * 【按品类+品牌召回人气商品】 87 + * 【按品类+品牌召回品】
84 * 88 *
85 * @param paramQueryFilter 89 * @param paramQueryFilter
86 * @param sortBrand 90 * @param sortBrand
87 * @param size 91 * @param size
88 * @return 92 * @return
89 */ 93 */
90 - private RecallRequest buildSortBrandHeatValueRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {  
91 - IStrategy strategy = new SortBrandHeatValueStrategy(sortBrand, size, sortBrandType); 94 + private RecallRequest buildSortBrandNewShelveRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
  95 + IStrategy strategy = new SortBrandNewShelveStrategy(sortBrand, size, sortBrandType);
92 return new RecallRequest(paramQueryFilter, strategy); 96 return new RecallRequest(paramQueryFilter, strategy);
93 } 97 }
94 98
95 /** 99 /**
96 - * 【按品类+品牌召回转化率高的商品 100 + * 【按品类+品牌召回新开促销
97 * 101 *
98 * @param paramQueryFilter 102 * @param paramQueryFilter
99 * @param sortBrand 103 * @param sortBrand
100 * @param size 104 * @param size
101 * @return 105 * @return
102 */ 106 */
103 - private RecallRequest buildSortBrandCtrValueRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {  
104 - IStrategy strategy = new SortBrandCtrValueStrategy(sortBrand, size, sortBrandType); 107 + private RecallRequest buildSortBrandPromotionRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
  108 + IStrategy strategy = new SortBrandPromotionStrategy(sortBrand, size, sortBrandType);
105 return new RecallRequest(paramQueryFilter, strategy); 109 return new RecallRequest(paramQueryFilter, strategy);
106 } 110 }
107 111
108 /** 112 /**
109 - * 【按品类+品牌召回新 113 + * 【按品类+品牌召回新降价
110 * 114 *
111 * @param paramQueryFilter 115 * @param paramQueryFilter
112 * @param sortBrand 116 * @param sortBrand
113 * @param size 117 * @param size
114 * @return 118 * @return
115 */ 119 */
116 - private RecallRequest buildSortBrandNewShelveRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {  
117 - IStrategy strategy = new SortBrandNewShelveStrategy(sortBrand, size, sortBrandType); 120 + private RecallRequest buildSortBrandReducePriceRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
  121 + IStrategy strategy = new SortBrandReducePriceStrategy(sortBrand, size, sortBrandType);
118 return new RecallRequest(paramQueryFilter, strategy); 122 return new RecallRequest(paramQueryFilter, strategy);
119 } 123 }
120 124
121 /** 125 /**
122 - * 【按品类+品牌召回新降价 126 + * 【按品类+品牌召回转化率高的商品
123 * 127 *
124 * @param paramQueryFilter 128 * @param paramQueryFilter
125 * @param sortBrand 129 * @param sortBrand
126 * @param size 130 * @param size
127 * @return 131 * @return
128 */ 132 */
129 - private RecallRequest buildSortBrandReducePriceRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {  
130 - IStrategy strategy = new SortBrandReducePriceStrategy(sortBrand, size, sortBrandType); 133 + private RecallRequest buildSortBrandCtrValueRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
  134 + IStrategy strategy = new SortBrandCtrValueStrategy(sortBrand, size, sortBrandType);
131 return new RecallRequest(paramQueryFilter, strategy); 135 return new RecallRequest(paramQueryFilter, strategy);
132 } 136 }
133 137
134 /** 138 /**
135 - * 【按品类+品牌召回新开促销 139 + * 【按品类+品牌召回人气商品
136 * 140 *
137 * @param paramQueryFilter 141 * @param paramQueryFilter
138 * @param sortBrand 142 * @param sortBrand
139 * @param size 143 * @param size
140 * @return 144 * @return
141 */ 145 */
142 - private RecallRequest buildSortBrandPromotionRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {  
143 - IStrategy strategy = new SortBrandPromotionStrategy(sortBrand, size, sortBrandType); 146 + private RecallRequest buildSortBrandHeatValueRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
  147 + IStrategy strategy = new SortBrandHeatValueStrategy(sortBrand, size, sortBrandType);
  148 + return new RecallRequest(paramQueryFilter, strategy);
  149 + }
  150 +
  151 + /**
  152 + * 【按品类+品牌随机召回】
  153 + *
  154 + * @param paramQueryFilter
  155 + * @param sortBrand
  156 + * @param size
  157 + * @return
  158 + */
  159 + private RecallRequest buildSortBrandRandomRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
  160 + IStrategy strategy = new SortBrandRandomStrategy(sortBrand, size, sortBrandType);
144 return new RecallRequest(paramQueryFilter, strategy); 161 return new RecallRequest(paramQueryFilter, strategy);
145 } 162 }
146 163
@@ -156,7 +156,7 @@ public class ExtendFilterHelper { @@ -156,7 +156,7 @@ public class ExtendFilterHelper {
156 } 156 }
157 157
158 /** 158 /**
159 - * 【品类+品牌】人气 159 + * 【品类+品牌】点击率
160 * 160 *
161 * @return 161 * @return
162 */ 162 */
@@ -169,6 +169,20 @@ public class ExtendFilterHelper { @@ -169,6 +169,20 @@ public class ExtendFilterHelper {
169 return filter; 169 return filter;
170 } 170 }
171 171
  172 + /**
  173 + * 【品类+品牌】随机
  174 + *
  175 + * @return
  176 + */
  177 + public static QueryBuilder sortBrandRandom(SortBrand sortBrand) {
  178 + BoolQueryBuilder filter = QueryBuilders.boolQuery();
  179 + //must
  180 + filter.must(sortBrandIdFilter(sortBrand));
  181 + //must not
  182 + filter.mustNot(notRecallFilter());
  183 + return filter;
  184 + }
  185 +
172 186
173 private static QueryBuilder sortBrandIdFilter(SortBrand sortBrand) { 187 private static QueryBuilder sortBrandIdFilter(SortBrand sortBrand) {
174 BoolQueryBuilder filter = QueryBuilders.boolQuery(); 188 BoolQueryBuilder filter = QueryBuilders.boolQuery();
@@ -9,23 +9,26 @@ public enum StrategyEnum { @@ -9,23 +9,26 @@ public enum StrategyEnum {
9 ADD_FLOW(106),//流量补偿 9 ADD_FLOW(106),//流量补偿
10 NEW_SHOP(105),//新开店铺 10 NEW_SHOP(105),//新开店铺
11 11
12 - REC_S_B_HEAT_VALUE(80),//实时的品牌+品类的人气值  
13 - REC_S_B_CTR_VALUE(81),//实时的品牌+品类的转化率  
14 - REC_S_B_REDUCE_PRICE(82),//实时的品牌+品类的最新降价  
15 - REC_S_B_PROMOTION(83),//实时的品牌+品类的新开促销  
16 - REC_S_B_NEW(84),//实时的品牌+品类的新品  
17 -  
18 - VEC_RNN_S_B_HEAT_VALUE(60),//向量预测的品牌+品类的人气值  
19 - VEC_RNN_S_B_CTR_VALUE(61),//实时的品牌+品类的转化率  
20 - VEC_RNN_S_B_REDUCE_PRICE(62),//向量预测的品牌+品类的最新降价  
21 - VEC_RNN_S_B_PROMOTION(63),//向量预测的品牌+品类的新开促销  
22 - VEC_RNN_S_B_NEW(64),//向量预测的品牌+品类的新品  
23 -  
24 - VEC_W2V_S_B_HEAT_VALUE(50),//向量预测的品牌+品类的人气值  
25 - VEC_W2V_S_B_CTR_VALUE(51),//实时的品牌+品类的转化率  
26 - VEC_W2V_S_B_REDUCE_PRICE(52),//向量预测的品牌+品类的最新降价  
27 - VEC_W2V_S_B_PROMOTION(53),//向量预测的品牌+品类的新开促销  
28 - VEC_W2V_S_B_NEW(54),//向量预测的品牌+品类的新品 12 + REC_S_B_NEW(89),//实时的品牌+品类的新品
  13 + REC_S_B_PROMOTION(88),//实时的品牌+品类的新开促销
  14 + REC_S_B_REDUCE_PRICE(87),//实时的品牌+品类的最新降价
  15 + REC_S_B_CTR_VALUE(86),//实时的品牌+品类的转化率
  16 + REC_S_B_HEAT_VALUE(85),//实时的品牌+品类的人气值
  17 + REC_S_B_RANDOM(84),//实时的品牌+品类的随机
  18 +
  19 + VEC_RNN_S_B_NEW(79),//向量预测的品牌+品类的新品
  20 + VEC_RNN_S_B_PROMOTION(78),//向量预测的品牌+品类的新开促销
  21 + VEC_RNN_S_B_REDUCE_PRICE(77),//向量预测的品牌+品类的最新降价
  22 + VEC_RNN_S_B_CTR_VALUE(76),//实时的品牌+品类的转化率
  23 + VEC_RNN_S_B_HEAT_VALUE(75),//向量预测的品牌+品类的人气值
  24 + VEC_RNN_S_B_RANDOM(74),//向量预测的品牌+品类的随机
  25 +
  26 + VEC_W2V_S_B_NEW(69),//向量预测的品牌+品类的新品
  27 + VEC_W2V_S_B_PROMOTION(68),//向量预测的品牌+品类的新开促销
  28 + VEC_W2V_S_B_REDUCE_PRICE(67),//向量预测的品牌+品类的最新降价
  29 + VEC_W2V_S_B_CTR_VALUE(66),//实时的品牌+品类的转化率
  30 + VEC_W2V_S_B_HEAT_VALUE(65),//向量预测的品牌+品类的人气值
  31 + VEC_W2V_S_B_RANDOM(64),//向量预测的品牌+品类的随机
29 32
30 COMMON_CTR_VALUE(2),//页面兜底召回-包含个性化【随机200取40】 33 COMMON_CTR_VALUE(2),//页面兜底召回-包含个性化【随机200取40】
31 COMMON_HEAT_VALUE(1),//页面兜底召回-包含个性化【随机200取40】 34 COMMON_HEAT_VALUE(1),//页面兜底召回-包含个性化【随机200取40】
@@ -102,4 +102,17 @@ public abstract class SortBrandAbstractStrategy implements IStrategy { @@ -102,4 +102,17 @@ public abstract class SortBrandAbstractStrategy implements IStrategy {
102 } 102 }
103 } 103 }
104 104
  105 + public StrategyEnum randomStrategyEnum(SortBrandType sortBrandType) {
  106 + switch (sortBrandType) {
  107 + case REC_SORT_BRAND:
  108 + return StrategyEnum.REC_S_B_RANDOM;
  109 + case VEC_RNN_SORT_BRAND:
  110 + return StrategyEnum.VEC_RNN_S_B_RANDOM;
  111 + case VEC_W2V_SORT_BRAND:
  112 + return StrategyEnum.VEC_W2V_S_B_RANDOM;
  113 + default:
  114 + return null;
  115 + }
  116 + }
  117 +
105 } 118 }
  1 +package com.yoho.search.recall.beans.strategy.impls;
  2 +
  3 +import com.yoho.search.core.personalized.models.SortBrand;
  4 +import com.yoho.search.recall.beans.helper.ExtendFilterHelper;
  5 +import com.yoho.search.recall.beans.helper.SortBuilderHelper;
  6 +import com.yoho.search.recall.beans.strategy.SortBrandType;
  7 +import com.yoho.search.recall.beans.strategy.StrategyEnum;
  8 +import org.elasticsearch.index.query.QueryBuilder;
  9 +import org.elasticsearch.search.sort.SortBuilder;
  10 +
  11 +public class SortBrandRandomStrategy extends SortBrandAbstractStrategy {
  12 +
  13 + public SortBrandRandomStrategy(SortBrand sortBrand, int size, SortBrandType sortBrandType) {
  14 + super(sortBrand,size,sortBrandType);
  15 + }
  16 +
  17 + @Override
  18 + public StrategyEnum strategtEnum() {
  19 + return randomStrategyEnum(this.sortBrandType);
  20 + }
  21 +
  22 + @Override
  23 + public QueryBuilder extendFilter() {
  24 + return ExtendFilterHelper.sortBrandRandom(sortBrand);
  25 + }
  26 +
  27 + @Override
  28 + public SortBuilder<?> sortBuilder() {
  29 + return SortBuilderHelper.getRandomSort();
  30 + }
  31 +
  32 +}
@@ -7,6 +7,7 @@ public class ProductCountConfig { @@ -7,6 +7,7 @@ public class ProductCountConfig {
7 private int reducePrice; 7 private int reducePrice;
8 private int ctrValue; 8 private int ctrValue;
9 private int heatValue; 9 private int heatValue;
  10 + private int random;
10 11
11 public int getNewShelve() { 12 public int getNewShelve() {
12 return newShelve; 13 return newShelve;
@@ -47,4 +48,12 @@ public class ProductCountConfig { @@ -47,4 +48,12 @@ public class ProductCountConfig {
47 public void setHeatValue(int heatValue) { 48 public void setHeatValue(int heatValue) {
48 this.heatValue = heatValue; 49 this.heatValue = heatValue;
49 } 50 }
  51 +
  52 + public int getRandom() {
  53 + return random;
  54 + }
  55 +
  56 + public void setRandom(int random) {
  57 + this.random = random;
  58 + }
50 } 59 }
@@ -16,6 +16,7 @@ public class ProductCountConfigService { @@ -16,6 +16,7 @@ public class ProductCountConfigService {
16 private static int DEFAULT_REDUCE_PRICE = 6; 16 private static int DEFAULT_REDUCE_PRICE = 6;
17 private static int DEFAULT_CTR_VALUE = 6; 17 private static int DEFAULT_CTR_VALUE = 6;
18 private static int DEFAULT_HEAT_VALUE = 6; 18 private static int DEFAULT_HEAT_VALUE = 6;
  19 + private static int DEFAULT_RANDOM = 0;
19 20
20 private Map<Integer, ProductCountConfig> middleSortConfig = new HashMap<>(); 21 private Map<Integer, ProductCountConfig> middleSortConfig = new HashMap<>();
21 private Map<Integer, ProductCountConfig> brandConfig = new HashMap<>(); 22 private Map<Integer, ProductCountConfig> brandConfig = new HashMap<>();
@@ -41,7 +42,7 @@ public class ProductCountConfigService { @@ -41,7 +42,7 @@ public class ProductCountConfigService {
41 if (pageProductCountConfig != null) { 42 if (pageProductCountConfig != null) {
42 return pageProductCountConfig; 43 return pageProductCountConfig;
43 } 44 }
44 - return genProductCountConfig(DEFAULT_NEW_SHELVE, DEFAULT_PROMOTION, DEFAULT_REDUCE_PRICE, DEFAULT_CTR_VALUE, DEFAULT_HEAT_VALUE); 45 + return genProductCountConfig(DEFAULT_NEW_SHELVE, DEFAULT_PROMOTION, DEFAULT_REDUCE_PRICE, DEFAULT_CTR_VALUE, DEFAULT_HEAT_VALUE,DEFAULT_RANDOM);
45 } 46 }
46 47
47 private ProductCountConfig genProductCountConfigByCompare(ProductCountConfig productCountConfig1, ProductCountConfig productCountConfig2) { 48 private ProductCountConfig genProductCountConfigByCompare(ProductCountConfig productCountConfig1, ProductCountConfig productCountConfig2) {
@@ -50,16 +51,18 @@ public class ProductCountConfigService { @@ -50,16 +51,18 @@ public class ProductCountConfigService {
50 int reducePrice = Math.min(productCountConfig1.getReducePrice(), productCountConfig2.getReducePrice()); 51 int reducePrice = Math.min(productCountConfig1.getReducePrice(), productCountConfig2.getReducePrice());
51 int ctrValue = Math.min(productCountConfig1.getCtrValue(), productCountConfig2.getCtrValue()); 52 int ctrValue = Math.min(productCountConfig1.getCtrValue(), productCountConfig2.getCtrValue());
52 int heatValue = Math.min(productCountConfig1.getHeatValue(), productCountConfig2.getHeatValue()); 53 int heatValue = Math.min(productCountConfig1.getHeatValue(), productCountConfig2.getHeatValue());
53 - return genProductCountConfig(newShelve, promotion, reducePrice, ctrValue, heatValue); 54 + int random = Math.min(productCountConfig1.getHeatValue(), productCountConfig2.getHeatValue());
  55 + return genProductCountConfig(newShelve, promotion, reducePrice, ctrValue, heatValue,random);
54 } 56 }
55 57
56 - private ProductCountConfig genProductCountConfig(int newShelve, int promotion, int reducePrice, int ctrValue, int heatValue) { 58 + private ProductCountConfig genProductCountConfig(int newShelve, int promotion, int reducePrice, int ctrValue, int heatValue,int random) {
57 ProductCountConfig productCountConfig = new ProductCountConfig(); 59 ProductCountConfig productCountConfig = new ProductCountConfig();
58 productCountConfig.setNewShelve(newShelve); 60 productCountConfig.setNewShelve(newShelve);
59 productCountConfig.setPromotion(promotion); 61 productCountConfig.setPromotion(promotion);
60 productCountConfig.setReducePrice(reducePrice); 62 productCountConfig.setReducePrice(reducePrice);
61 productCountConfig.setCtrValue(ctrValue); 63 productCountConfig.setCtrValue(ctrValue);
62 productCountConfig.setHeatValue(heatValue); 64 productCountConfig.setHeatValue(heatValue);
  65 + productCountConfig.setRandom(random);
63 return productCountConfig; 66 return productCountConfig;
64 } 67 }
65 } 68 }