Authored by hugufei

支持FirstSknRequest和CommonHeatValueStrategy的配置

... ... @@ -110,7 +110,7 @@ public class UserRecallCacheBean extends AbstractCacheBean<UserRecallRequest, Us
CompletableFuture<List<RecallRequestResponse>> sknListCompletableFuture = this.doRecallSknList(userRecallRequest, userPersonalFactor);
//2、处理通用召回
CompletableFuture<List<RecallRequestResponse>> commonCompletableFuture = this.doRecallCommon(userRecallRequest, userPersonalFactor);
CompletableFuture<List<RecallRequestResponse>> commonCompletableFuture = this.doRecallCommon(userRecallRequest);
//3、处理实时推荐的品类品牌的召回
CompletableFuture<List<RecallRequestResponse>> realTimeSortBrandCompletableFuture = this.doRecallRealTimeSortBrand(userRecallRequest, userPersonalFactor);
... ... @@ -150,13 +150,12 @@ public class UserRecallCacheBean extends AbstractCacheBean<UserRecallRequest, Us
* 执行通用的召回
*
* @param userRecallRequest
* @param userPersonalFactor
* @return
*/
private CompletableFuture<List<RecallRequestResponse>> doRecallCommon(UserRecallRequest userRecallRequest, UserPersonalFactor userPersonalFactor) {
private CompletableFuture<List<RecallRequestResponse>> doRecallCommon(UserRecallRequest userRecallRequest) {
return CompletableFuture.supplyAsync(() -> {
long begin = System.currentTimeMillis();
List<RecallRequest> commonRequests = commonRequestBuilder.buildCommonRecallRequests(userRecallRequest, userRecallRequest.getPageSize(), userRecallRequest.getFirstProductSkns());
List<RecallRequest> commonRequests = commonRequestBuilder.buildCommonRecallRequests(userRecallRequest);
List<RecallRequestResponse> commonRequestResponses = batchRecallBaseService.batchRecallAndCache(commonRequests);
RECALL_NEW_LOGGER.info("UserRecallCacheBean[2.1]-doRecallCommon,requestCount is [{}], cost is [{}]", commonRequests.size(), System.currentTimeMillis() - begin);
return commonRequestResponses;
... ...
... ... @@ -22,14 +22,13 @@ public class CommonRecallRequestBuilder {
* 批量召回业务需求
*
* @param userRecallRequest
* @param firstProductSkns
* @return
*/
public List<RecallRequest> buildCommonRecallRequests(UserRecallRequest userRecallRequest, int pageSize, List<String> firstProductSkns) {
public List<RecallRequest> buildCommonRecallRequests(UserRecallRequest userRecallRequest) {
//1、构造召回请求
List<RecallRequest> requests = new ArrayList<>();
//1.1) firstSkn的召回
requests.add(this.buildFirstSknRequest(userRecallRequest, firstProductSkns));
requests.add(this.buildFirstSknRequest(userRecallRequest));
//1.2) 直通车召回
requests.add(this.buildDirectTrainRequest(userRecallRequest));
//1.3) 直通车-ufo召回
... ... @@ -41,7 +40,9 @@ public class CommonRecallRequestBuilder {
//1.6) 新品的召回
requests.add(this.buildNewProductRequest(userRecallRequest));
//1.7) 页面的兜底召回
requests.add(this.buildCommonHeatValueStrategy(userRecallRequest, pageSize));
requests.add(this.buildCommonRandomStrategy(userRecallRequest));
//1.8) 页面的兜底召回
requests.add(this.buildCommonHeatValueStrategy(userRecallRequest, userRecallRequest.getPageSize()));
return requests;
}
... ... @@ -49,11 +50,12 @@ public class CommonRecallRequestBuilder {
* 构造【按FIRST_SKN召回】的请求参数
*
* @param userRecallRequest
* @param firstProductSkns
* @return
*/
private RecallRequest buildFirstSknRequest(UserRecallRequest userRecallRequest, List<String> firstProductSkns) {
CommonFirstSknStrategy strategy = new CommonFirstSknStrategy(1, firstProductSkns);
private RecallRequest buildFirstSknRequest(UserRecallRequest userRecallRequest) {
List<String> firstProductSkns = userRecallRequest.getFirstProductSkns();
int size = recallConfigService.queryStrategyConfigSize(userRecallRequest, StrategyEnum.FIRST_SKN, 0);
CommonFirstSknStrategy strategy = new CommonFirstSknStrategy(size, firstProductSkns);
return new RecallRequest(userRecallRequest.getParamQueryFilter(), strategy);
}
... ... @@ -118,6 +120,19 @@ public class CommonRecallRequestBuilder {
}
/**
* 构建【随机】的请求参数
*
* @param userRecallRequest
* @return
*/
private RecallRequest buildCommonRandomStrategy(UserRecallRequest userRecallRequest) {
int size = recallConfigService.queryStrategyConfigSize(userRecallRequest, StrategyEnum.COMMON_RANDOM, 0);
CommonRandomStrategy strategy = new CommonRandomStrategy(size);
return new RecallRequest(userRecallRequest.getParamQueryFilter(), strategy);
}
/**
* 构建【按兜底召回】的请求参数
*
* @param userRecallRequest
... ... @@ -126,6 +141,9 @@ public class CommonRecallRequestBuilder {
*/
private RecallRequest buildCommonHeatValueStrategy(UserRecallRequest userRecallRequest, int defaultSize) {
int size = recallConfigService.queryStrategyConfigSize(userRecallRequest, StrategyEnum.COMMON_HEAT_VALUE, defaultSize);
if (size == 0) {
size = defaultSize;
}
CommonHeatValueStrategy strategy = new CommonHeatValueStrategy(size);
return new RecallRequest(userRecallRequest.getParamQueryFilter(), strategy);
}
... ...
... ... @@ -2,7 +2,6 @@ package com.yoho.search.service.recall.config;
import com.alibaba.fastjson.JSON;
import com.yoho.search.core.personalized.models.SortBrand;
import com.yoho.search.service.recall.helper.StrategyHelper;
import com.yoho.search.service.recall.models.personal.PagePersonalFactor;
import com.yoho.search.service.recall.models.req.UserRecallRequest;
import com.yoho.search.service.recall.strategy.SortBrandType;
... ... @@ -41,7 +40,7 @@ public class RecallConfigService {
* @return
*/
public int queryStrategyConfigSize(UserRecallRequest userRecallRequest, StrategyEnum strategyEnum, int defaultSize) {
int size = sizeIntervalService.queryConfigSize(userRecallRequest.getPageId(),userRecallRequest.isDefaultOrder(), strategyEnum.name(), defaultSize);
int size = sizeIntervalService.queryConfigSize(userRecallRequest.getPageId(), userRecallRequest.isDefaultOrder(), strategyEnum.name(), defaultSize);
size = this.legallValue(size, 0, 200);
if (userRecallRequest.openDetailLog()) {
RECALL_LOGGER.info("queryStrategyConfigSize,pageId is [{}],isDefaultOrder is [{}], strategyEnum is [{}],size is[{}]", userRecallRequest.getPageId(), userRecallRequest.isDefaultOrder(), strategyEnum.name(), size);
... ... @@ -58,19 +57,21 @@ public class RecallConfigService {
*/
public int queryStrategyConfigInterval(UserRecallRequest userRecallRequest, StrategyEnum strategyEnum, int defaultInterval) {
int interval = sizeIntervalService.queryConfigInterval(userRecallRequest.getPageId(), userRecallRequest.isDefaultOrder(), strategyEnum.name(), defaultInterval);
interval = this.legallValue(interval, 2, 40);
interval = this.legallValue(interval, 1, 40);
if (userRecallRequest.openDetailLog()) {
RECALL_LOGGER.info("queryStrategyConfigInterval,pageId is [{}],isDefaultOrder is [{}], strategyEnum is [{}],interval is[{}]", userRecallRequest.getPageId(), userRecallRequest.isDefaultOrder(), strategyEnum.name(), interval);
}
return interval;
}
/**
*
* @param userRecallRequest
* @param sortBrandType
* @param defaultSize
* @return
*/
public int querySortBrandConfigCount(UserRecallRequest userRecallRequest, SortBrandType sortBrandType, int defaultSize) {
int size = sizeIntervalService.queryConfigSize(userRecallRequest.getPageId(), userRecallRequest.isDefaultOrder(),sortBrandType.name(), defaultSize);
int size = sizeIntervalService.queryConfigSize(userRecallRequest.getPageId(), userRecallRequest.isDefaultOrder(), sortBrandType.name(), defaultSize);
size = this.legallValue(size, 0, 30);
return size;
}
... ... @@ -84,7 +85,7 @@ public class RecallConfigService {
* @return
*/
public SortBrandSknCount queryRecallSknCount(UserRecallRequest userRecallRequest, SortBrandType sortBrandType, SortBrand sortBrand) {
SortBrandSknCount sortBrandSknCount = sortBrandSknCountService.queryRecallSknCount(userRecallRequest.getPageId(),userRecallRequest.isDefaultOrder(),sortBrandType.name(), sortBrand);
SortBrandSknCount sortBrandSknCount = sortBrandSknCountService.queryRecallSknCount(userRecallRequest.getPageId(), userRecallRequest.isDefaultOrder(), sortBrandType.name(), sortBrand);
if (sortBrandSknCount == null) {
RECALL_LOGGER.info("queryRecallSknCount,pageId is [{}],sortBrandType is [{}],sortBrand is[{}], RecallSknCount is[{}]", userRecallRequest.getPageId(), sortBrand.key(), sortBrandType.name(), "null");
return null;
... ...
... ... @@ -17,7 +17,7 @@ public class StrategyHelper {
* @return
*/
public static boolean isCommonStrategy(StrategyEnum strategy) {
return strategy.equals(StrategyEnum.COMMON_CTR_VALUE) || strategy.equals(StrategyEnum.COMMON_HEAT_VALUE);
return strategy.equals(StrategyEnum.COMMON_RANDOM) || strategy.equals(StrategyEnum.COMMON_HEAT_VALUE);
}
... ...
... ... @@ -46,11 +46,10 @@ public enum StrategyEnum {
CONFIG_S_B_HEAT_VALUE(296),//配置的的品牌+品类的人气值
CONFIG_S_B_RANDOM(295),//配置的的品牌+品类的随机
COMMON_CTR_VALUE(2),//页面兜底召回
COMMON_HEAT_VALUE(1),//页面兜底召回
COMMON_HEAT_VALUE(2),//页面兜底-人气召回
COMMON_RANDOM(1),//页面兜底召回-随机召回
DEFAULT_HEAT_VALUE(-1),//第四部分做A/B测试
DEFAULT_CTR_VALUE(-2);//第四部分做A/B测试
DEFAULT_HEAT_VALUE(-1);//第四部分
private Integer priority;
... ...
package com.yoho.search.service.recall.strategy.impls;
import com.yoho.search.cache.CacheTimeConstants;
import com.yoho.search.service.recall.helper.SortBuilderHelper;
import com.yoho.search.service.recall.strategy.IStrategy;
import com.yoho.search.service.recall.strategy.StrategyEnum;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.sort.SortBuilder;
/**
* 页面随机召回
*
* @author gufei.hu
*/
public class CommonRandomStrategy implements IStrategy {
private int size;
public CommonRandomStrategy(int size) {
this.size = size;
}
@Override
public StrategyEnum strategtEnum() {
return StrategyEnum.COMMON_RANDOM;
}
@Override
public QueryBuilder extendFilter() {
return null;
}
@Override
public SortBuilder<?> sortBuilder() {
return SortBuilderHelper.getRandomSort();
}
@Override
public int size() {
return size;
}
@Override
public int cacheTimeInMinute() {
return CacheTimeConstants.COMMON_RECALL_STRATEGY_CACHE_TIME;
}
@Override
public String strategyCacheKey() {
StringBuilder sb = defaultStrategyKey();
return sb.toString();
}
}
... ...