Authored by hugufei

商品支持随机召回

... ... @@ -48,22 +48,26 @@ public class SortBrandRecallRequestBuilder {
if (productCountConfig.getNewShelve() > 0) {
requests.add(this.buildSortBrandNewShelveRequest(paramQueryFilter, sortBrand, productCountConfig.getNewShelve(), sortBrandType));
}
// 2) 人气
if (productCountConfig.getHeatValue() > 0) {
requests.add(this.buildSortBrandHeatValueRequest(paramQueryFilter, sortBrand, productCountConfig.getHeatValue(), sortBrandType));
// 2) 新开促销
if (productCountConfig.getPromotion() > 0) {
requests.add(this.buildSortBrandPromotionRequest(paramQueryFilter, sortBrand, productCountConfig.getPromotion(), sortBrandType));
}
// 3) 新降价
if (productCountConfig.getReducePrice() > 0) {
requests.add(this.buildSortBrandReducePriceRequest(paramQueryFilter, sortBrand, productCountConfig.getReducePrice(), sortBrandType));
}
// 4) 新开促销
if (productCountConfig.getPromotion() > 0) {
requests.add(this.buildSortBrandPromotionRequest(paramQueryFilter, sortBrand, productCountConfig.getPromotion(), sortBrandType));
}
// 5) 转化率
// 4) 转化率
if (productCountConfig.getCtrValue() > 0) {
requests.add(this.buildSortBrandCtrValueRequest(paramQueryFilter, sortBrand, productCountConfig.getCtrValue(), sortBrandType));
}
// 5) 人气
if (productCountConfig.getHeatValue() > 0) {
requests.add(this.buildSortBrandHeatValueRequest(paramQueryFilter, sortBrand, productCountConfig.getHeatValue(), sortBrandType));
}
// 6) 随机
if (productCountConfig.getRandom() > 0) {
requests.add(this.buildSortBrandRandomRequest(paramQueryFilter, sortBrand, productCountConfig.getRandom(), sortBrandType));
}
}
return requests;
}
... ... @@ -80,67 +84,80 @@ public class SortBrandRecallRequestBuilder {
}
/**
* 【按品类+品牌召回人气商品】
* 【按品类+品牌召回品】
*
* @param paramQueryFilter
* @param sortBrand
* @param size
* @return
*/
private RecallRequest buildSortBrandHeatValueRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
IStrategy strategy = new SortBrandHeatValueStrategy(sortBrand, size, sortBrandType);
private RecallRequest buildSortBrandNewShelveRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
IStrategy strategy = new SortBrandNewShelveStrategy(sortBrand, size, sortBrandType);
return new RecallRequest(paramQueryFilter, strategy);
}
/**
* 【按品类+品牌召回转化率高的商品
* 【按品类+品牌召回新开促销
*
* @param paramQueryFilter
* @param sortBrand
* @param size
* @return
*/
private RecallRequest buildSortBrandCtrValueRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
IStrategy strategy = new SortBrandCtrValueStrategy(sortBrand, size, sortBrandType);
private RecallRequest buildSortBrandPromotionRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
IStrategy strategy = new SortBrandPromotionStrategy(sortBrand, size, sortBrandType);
return new RecallRequest(paramQueryFilter, strategy);
}
/**
* 【按品类+品牌召回新
* 【按品类+品牌召回新降价
*
* @param paramQueryFilter
* @param sortBrand
* @param size
* @return
*/
private RecallRequest buildSortBrandNewShelveRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
IStrategy strategy = new SortBrandNewShelveStrategy(sortBrand, size, sortBrandType);
private RecallRequest buildSortBrandReducePriceRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
IStrategy strategy = new SortBrandReducePriceStrategy(sortBrand, size, sortBrandType);
return new RecallRequest(paramQueryFilter, strategy);
}
/**
* 【按品类+品牌召回新降价
* 【按品类+品牌召回转化率高的商品
*
* @param paramQueryFilter
* @param sortBrand
* @param size
* @return
*/
private RecallRequest buildSortBrandReducePriceRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
IStrategy strategy = new SortBrandReducePriceStrategy(sortBrand, size, sortBrandType);
private RecallRequest buildSortBrandCtrValueRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
IStrategy strategy = new SortBrandCtrValueStrategy(sortBrand, size, sortBrandType);
return new RecallRequest(paramQueryFilter, strategy);
}
/**
* 【按品类+品牌召回新开促销
* 【按品类+品牌召回人气商品
*
* @param paramQueryFilter
* @param sortBrand
* @param size
* @return
*/
private RecallRequest buildSortBrandPromotionRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
IStrategy strategy = new SortBrandPromotionStrategy(sortBrand, size, sortBrandType);
private RecallRequest buildSortBrandHeatValueRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
IStrategy strategy = new SortBrandHeatValueStrategy(sortBrand, size, sortBrandType);
return new RecallRequest(paramQueryFilter, strategy);
}
/**
* 【按品类+品牌随机召回】
*
* @param paramQueryFilter
* @param sortBrand
* @param size
* @return
*/
private RecallRequest buildSortBrandRandomRequest(ParamQueryFilter paramQueryFilter, SortBrand sortBrand, int size, SortBrandType sortBrandType) {
IStrategy strategy = new SortBrandRandomStrategy(sortBrand, size, sortBrandType);
return new RecallRequest(paramQueryFilter, strategy);
}
... ...
... ... @@ -156,7 +156,7 @@ public class ExtendFilterHelper {
}
/**
* 【品类+品牌】人气
* 【品类+品牌】点击率
*
* @return
*/
... ... @@ -169,6 +169,20 @@ public class ExtendFilterHelper {
return filter;
}
/**
* 【品类+品牌】随机
*
* @return
*/
public static QueryBuilder sortBrandRandom(SortBrand sortBrand) {
BoolQueryBuilder filter = QueryBuilders.boolQuery();
//must
filter.must(sortBrandIdFilter(sortBrand));
//must not
filter.mustNot(notRecallFilter());
return filter;
}
private static QueryBuilder sortBrandIdFilter(SortBrand sortBrand) {
BoolQueryBuilder filter = QueryBuilders.boolQuery();
... ...
... ... @@ -9,23 +9,26 @@ public enum StrategyEnum {
ADD_FLOW(106),//流量补偿
NEW_SHOP(105),//新开店铺
REC_S_B_HEAT_VALUE(80),//实时的品牌+品类的人气值
REC_S_B_CTR_VALUE(81),//实时的品牌+品类的转化率
REC_S_B_REDUCE_PRICE(82),//实时的品牌+品类的最新降价
REC_S_B_PROMOTION(83),//实时的品牌+品类的新开促销
REC_S_B_NEW(84),//实时的品牌+品类的新品
VEC_RNN_S_B_HEAT_VALUE(60),//向量预测的品牌+品类的人气值
VEC_RNN_S_B_CTR_VALUE(61),//实时的品牌+品类的转化率
VEC_RNN_S_B_REDUCE_PRICE(62),//向量预测的品牌+品类的最新降价
VEC_RNN_S_B_PROMOTION(63),//向量预测的品牌+品类的新开促销
VEC_RNN_S_B_NEW(64),//向量预测的品牌+品类的新品
VEC_W2V_S_B_HEAT_VALUE(50),//向量预测的品牌+品类的人气值
VEC_W2V_S_B_CTR_VALUE(51),//实时的品牌+品类的转化率
VEC_W2V_S_B_REDUCE_PRICE(52),//向量预测的品牌+品类的最新降价
VEC_W2V_S_B_PROMOTION(53),//向量预测的品牌+品类的新开促销
VEC_W2V_S_B_NEW(54),//向量预测的品牌+品类的新品
REC_S_B_NEW(89),//实时的品牌+品类的新品
REC_S_B_PROMOTION(88),//实时的品牌+品类的新开促销
REC_S_B_REDUCE_PRICE(87),//实时的品牌+品类的最新降价
REC_S_B_CTR_VALUE(86),//实时的品牌+品类的转化率
REC_S_B_HEAT_VALUE(85),//实时的品牌+品类的人气值
REC_S_B_RANDOM(84),//实时的品牌+品类的随机
VEC_RNN_S_B_NEW(79),//向量预测的品牌+品类的新品
VEC_RNN_S_B_PROMOTION(78),//向量预测的品牌+品类的新开促销
VEC_RNN_S_B_REDUCE_PRICE(77),//向量预测的品牌+品类的最新降价
VEC_RNN_S_B_CTR_VALUE(76),//实时的品牌+品类的转化率
VEC_RNN_S_B_HEAT_VALUE(75),//向量预测的品牌+品类的人气值
VEC_RNN_S_B_RANDOM(74),//向量预测的品牌+品类的随机
VEC_W2V_S_B_NEW(69),//向量预测的品牌+品类的新品
VEC_W2V_S_B_PROMOTION(68),//向量预测的品牌+品类的新开促销
VEC_W2V_S_B_REDUCE_PRICE(67),//向量预测的品牌+品类的最新降价
VEC_W2V_S_B_CTR_VALUE(66),//实时的品牌+品类的转化率
VEC_W2V_S_B_HEAT_VALUE(65),//向量预测的品牌+品类的人气值
VEC_W2V_S_B_RANDOM(64),//向量预测的品牌+品类的随机
COMMON_CTR_VALUE(2),//页面兜底召回-包含个性化【随机200取40】
COMMON_HEAT_VALUE(1),//页面兜底召回-包含个性化【随机200取40】
... ...
... ... @@ -102,4 +102,17 @@ public abstract class SortBrandAbstractStrategy implements IStrategy {
}
}
public StrategyEnum randomStrategyEnum(SortBrandType sortBrandType) {
switch (sortBrandType) {
case REC_SORT_BRAND:
return StrategyEnum.REC_S_B_RANDOM;
case VEC_RNN_SORT_BRAND:
return StrategyEnum.VEC_RNN_S_B_RANDOM;
case VEC_W2V_SORT_BRAND:
return StrategyEnum.VEC_W2V_S_B_RANDOM;
default:
return null;
}
}
}
... ...
package com.yoho.search.recall.beans.strategy.impls;
import com.yoho.search.core.personalized.models.SortBrand;
import com.yoho.search.recall.beans.helper.ExtendFilterHelper;
import com.yoho.search.recall.beans.helper.SortBuilderHelper;
import com.yoho.search.recall.beans.strategy.SortBrandType;
import com.yoho.search.recall.beans.strategy.StrategyEnum;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.sort.SortBuilder;
public class SortBrandRandomStrategy extends SortBrandAbstractStrategy {
public SortBrandRandomStrategy(SortBrand sortBrand, int size, SortBrandType sortBrandType) {
super(sortBrand,size,sortBrandType);
}
@Override
public StrategyEnum strategtEnum() {
return randomStrategyEnum(this.sortBrandType);
}
@Override
public QueryBuilder extendFilter() {
return ExtendFilterHelper.sortBrandRandom(sortBrand);
}
@Override
public SortBuilder<?> sortBuilder() {
return SortBuilderHelper.getRandomSort();
}
}
... ...
... ... @@ -7,6 +7,7 @@ public class ProductCountConfig {
private int reducePrice;
private int ctrValue;
private int heatValue;
private int random;
public int getNewShelve() {
return newShelve;
... ... @@ -47,4 +48,12 @@ public class ProductCountConfig {
public void setHeatValue(int heatValue) {
this.heatValue = heatValue;
}
public int getRandom() {
return random;
}
public void setRandom(int random) {
this.random = random;
}
}
... ...
... ... @@ -16,6 +16,7 @@ public class ProductCountConfigService {
private static int DEFAULT_REDUCE_PRICE = 6;
private static int DEFAULT_CTR_VALUE = 6;
private static int DEFAULT_HEAT_VALUE = 6;
private static int DEFAULT_RANDOM = 0;
private Map<Integer, ProductCountConfig> middleSortConfig = new HashMap<>();
private Map<Integer, ProductCountConfig> brandConfig = new HashMap<>();
... ... @@ -41,7 +42,7 @@ public class ProductCountConfigService {
if (pageProductCountConfig != null) {
return pageProductCountConfig;
}
return genProductCountConfig(DEFAULT_NEW_SHELVE, DEFAULT_PROMOTION, DEFAULT_REDUCE_PRICE, DEFAULT_CTR_VALUE, DEFAULT_HEAT_VALUE);
return genProductCountConfig(DEFAULT_NEW_SHELVE, DEFAULT_PROMOTION, DEFAULT_REDUCE_PRICE, DEFAULT_CTR_VALUE, DEFAULT_HEAT_VALUE,DEFAULT_RANDOM);
}
private ProductCountConfig genProductCountConfigByCompare(ProductCountConfig productCountConfig1, ProductCountConfig productCountConfig2) {
... ... @@ -50,16 +51,18 @@ public class ProductCountConfigService {
int reducePrice = Math.min(productCountConfig1.getReducePrice(), productCountConfig2.getReducePrice());
int ctrValue = Math.min(productCountConfig1.getCtrValue(), productCountConfig2.getCtrValue());
int heatValue = Math.min(productCountConfig1.getHeatValue(), productCountConfig2.getHeatValue());
return genProductCountConfig(newShelve, promotion, reducePrice, ctrValue, heatValue);
int random = Math.min(productCountConfig1.getHeatValue(), productCountConfig2.getHeatValue());
return genProductCountConfig(newShelve, promotion, reducePrice, ctrValue, heatValue,random);
}
private ProductCountConfig genProductCountConfig(int newShelve, int promotion, int reducePrice, int ctrValue, int heatValue) {
private ProductCountConfig genProductCountConfig(int newShelve, int promotion, int reducePrice, int ctrValue, int heatValue,int random) {
ProductCountConfig productCountConfig = new ProductCountConfig();
productCountConfig.setNewShelve(newShelve);
productCountConfig.setPromotion(promotion);
productCountConfig.setReducePrice(reducePrice);
productCountConfig.setCtrValue(ctrValue);
productCountConfig.setHeatValue(heatValue);
productCountConfig.setRandom(random);
return productCountConfig;
}
}
... ...