Authored by hugufei

Merge branch 'master' into brandproduct

... ... @@ -49,38 +49,6 @@ public class SearchCacheFactory {
return this.getOrCreateSearchCache("AGGREGATION", cacheType, cacheInMinute);
}
/**
* 获取默认的搜索缓存
*
* @return
*/
public SearchCache getProductCountSearchCache() {
CacheType cacheType = CacheType.SEARCH_REDIS;
int cacheInMinute = 15;
return this.getOrCreateSearchCache("PRODUCT_COUNT", cacheType, cacheInMinute);
}
/**
* 获取聚合相关的缓存
*
* @return
*/
public SearchCache getSelectionsForAppCache() {
CacheType cacheType = CacheType.SEARCH_REDIS;
int cacheInMinute = 15;
return this.getOrCreateSearchCache("SELECTIONS_APP", cacheType, cacheInMinute);
}
/**
* 获取聚合相关的缓存
*
* @return
*/
public SearchCache getSelectionsForPcCache() {
CacheType cacheType = CacheType.SEARCH_REDIS;
int cacheInMinute = 15;
return this.getOrCreateSearchCache("SELECTIONS_PC", cacheType, cacheInMinute);
}
/**
* 个性化聚合推荐相关的缓存
... ... @@ -94,17 +62,6 @@ public class SearchCacheFactory {
}
/**
* 品牌相关的缓存
*
* @return
*/
public SearchCache getBrandRelatedCache() {
CacheType cacheType = CacheType.SEARCH_REDIS;
int cacheInMinute = 15;
return this.getOrCreateSearchCache("BRAND_RELATED", cacheType, cacheInMinute);
}
/**
* aop的缓存
*
* @return
... ... @@ -135,27 +92,4 @@ public class SearchCacheFactory {
int cacheInMinute = 15;
return this.getOrCreateSearchCache("PROMOTION", cacheType, cacheInMinute);
}
/**
* PC列表的缓存
*
* @return
*/
public SearchCache getWebProductListSearchCache() {
CacheType cacheType = CacheType.SEARCH_REDIS;
int cacheInMinute = 15;
return this.getOrCreateSearchCache("WEB_PRODUCT_LIST", cacheType, cacheInMinute);
}
/**
* 有好货的缓存
*
* @return
*/
public SearchCache goodProductListSearchCache() {
CacheType cacheType = CacheType.SEARCH_REDIS;
int cacheInMinute = 15;
return this.getOrCreateSearchCache("GOOD_PRODUCT", cacheType, cacheInMinute);
}
}
... ...
... ... @@ -2,25 +2,23 @@ package com.yoho.search.service.scene.pages.promotion;
import com.alibaba.fastjson.JSONObject;
import com.yoho.search.base.utils.ISearchConstants;
import com.yoho.search.cache.log.SearchCacheMatchLogger;
import com.yoho.search.cache.model.SearchCache;
import com.yoho.search.cache.CacheTimeConstants;
import com.yoho.search.cache.beans.AbstractCacheComponent;
import com.yoho.search.common.SearchCommonService;
import com.yoho.search.common.SearchDynamicConfigService;
import com.yoho.search.core.es.model.SearchParam;
import com.yoho.search.core.es.model.SearchResult;
import com.yoho.search.models.PromotionConditions;
import com.yoho.search.models.SearchApiResult;
import com.yoho.search.service.recall.SceneRecallProductListService;
import com.yoho.search.service.recall.beans.builder.UserRecallRequestBuilder;
import com.yoho.search.service.recall.beans.strategy.NotRecallTypeEnum;
import com.yoho.search.service.recall.models.req.UserRecallRequest;
import com.yoho.search.cache.beans.SearchCacheService;
import com.yoho.search.common.SearchCommonService;
import com.yoho.search.common.SearchDynamicConfigService;
import com.yoho.search.service.index.ProductIndexBaseService;
import com.yoho.search.service.helper.ProductListHelper;
import com.yoho.search.service.helper.SearchCommonHelper;
import com.yoho.search.service.helper.SearchParamHelper;
import com.yoho.search.service.helper.SearchSortHelper;
import com.yoho.search.cache.beans.AbstractCacheAbleService;
import com.yoho.search.service.index.ProductIndexBaseService;
import com.yoho.search.service.recall.SceneRecallProductListService;
import com.yoho.search.service.recall.beans.builder.UserRecallRequestBuilder;
import com.yoho.search.service.recall.beans.strategy.NotRecallTypeEnum;
import com.yoho.search.service.recall.models.req.UserRecallRequest;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -29,7 +27,7 @@ import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class PromotionProductListService extends AbstractCacheAbleService {
public class PromotionProductListService extends AbstractCacheComponent<JSONObject> {
@Autowired
private PromotionSceneHelper promotionSceneHelper;
... ... @@ -44,8 +42,6 @@ public class PromotionProductListService extends AbstractCacheAbleService {
@Autowired
private SearchCommonHelper searchCommonHelper;
@Autowired
private SearchCacheService searchCacheService;
@Autowired
private UserRecallRequestBuilder userRecallRequestBuilder;
@Autowired
private SceneRecallProductListService sceneRecallProductListService;
... ... @@ -54,11 +50,6 @@ public class PromotionProductListService extends AbstractCacheAbleService {
@Autowired
private ProductIndexBaseService productIndexBaseService;
@Override
public SearchCache getSearchCache() {
return searchCacheFactory.getPromotionSearchCache();
}
/**
* 促销列表入口
*
... ... @@ -100,7 +91,6 @@ public class PromotionProductListService extends AbstractCacheAbleService {
return true;
}
/**
* 默认的促销列表的返回方式
*
... ... @@ -127,26 +117,32 @@ public class PromotionProductListService extends AbstractCacheAbleService {
searchParam.setIncludeFields(productIndexBaseService.getProductIndexIncludeFields());
// 5)从缓存中获取数据
final String productIndexName = ISearchConstants.INDEX_NAME_PRODUCT_INDEX;
JSONObject cacheObject = searchCacheService.getJSONObjectFromCache(this.searchCache, productIndexName, searchParam);
if (cacheObject != null) {
SearchCacheMatchLogger.doSearchCacheMatchLog("/promotion/list.json", paramMap);
return new SearchApiResult().setData(cacheObject);
}
JSONObject productListResult = super.queryWithCache(searchParam,paramMap);
return new SearchApiResult().setData(productListResult);
}
// 6)查询ES
@Override
protected JSONObject doRealQuery(SearchParam searchParam, Map<String, String> paramMap) throws Exception {
// 1、查询ES
final String productIndexName = ISearchConstants.INDEX_NAME_PRODUCT_INDEX;
SearchResult searchResult = searchCommonService.doSearch(productIndexName, searchParam);
if (searchResult == null) {
return new SearchApiResult().setCode(500).setMessage("execption");
throw new RuntimeException("searchResult is Empty");
}
// 7)构造返回结果
// 2、构造返回结果
boolean needResort = searchCommonHelper.isOrderEmpty(paramMap);
int pageSize = StringUtils.isBlank(paramMap.get("viewNum")) ? 10 : Integer.parseInt(paramMap.get("viewNum"));
JSONObject productListResult = productListHelper.buildProductListResult(searchResult, pageSize, needResort,needResort? NotRecallTypeEnum.W2V_PERSIONAL:NotRecallTypeEnum.NOT_PERSIONAL);
// 10)将结果存进缓存
searchCacheService.addJSONObjectToCache(this.searchCache, productIndexName, searchParam, productListResult);
return new SearchApiResult().setData(productListResult);
return productListResult;
}
@Override
protected int cacheTimeInMinute() {
return CacheTimeConstants.CACHE_15_MINUTE;
}
@Override
protected String cacheSceneKey() {
return "PROMOTION_PRODUCT_LIST";
}
}
... ...
package com.yoho.search.service.scene.shopbrand;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yoho.search.base.utils.CollectionUtils;
import com.yoho.search.base.utils.ISearchConstants;
import com.yoho.search.cache.beans.AbstractCacheAbleService;
import com.yoho.search.cache.log.SearchCacheMatchLogger;
import com.yoho.search.cache.model.SearchCache;
import com.yoho.search.cache.CacheTimeConstants;
import com.yoho.search.cache.beans.AbstractCacheComponent;
import com.yoho.search.common.SearchDynamicConfigService;
import com.yoho.search.common.SearchRequestParams;
import com.yoho.search.common.utils.SearchApiResultUtils;
import com.yoho.search.core.es.agg.IAggregation;
import com.yoho.search.core.es.model.SearchParam;
import com.yoho.search.models.SearchApiResult;
import com.yoho.search.service.aggregations.AggregationsService;
import com.yoho.search.service.aggregations.impls.AggregationFactory;
import com.yoho.search.common.SearchDynamicConfigService;
import com.yoho.search.common.SearchRequestParams;
import com.yoho.search.service.helper.SearchParamHelper;
import org.apache.commons.lang.StringUtils;
import com.yoho.search.models.SearchApiResult;
import org.apache.commons.collections.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@Service
public class RecommendShopService extends AbstractCacheAbleService {
public class RecommendShopService extends AbstractCacheComponent<JSONArray> {
private static final Logger logger = LoggerFactory.getLogger(RecommendShopService.class);
private static final int DEFAULT_AGGREGATION_COUNT = 100;
@Autowired
private AggregationsService aggregationsService;
... ... @@ -43,22 +39,18 @@ public class RecommendShopService extends AbstractCacheAbleService {
@Autowired
private SearchDynamicConfigService searchDynamicConfigService;
public SearchCache getSearchCache() {
return searchCacheFactory.getRecommendCache();
}
public SearchApiResult recommendShop(Map<String, String> paramMap) {
try {
// 0、开关支持是否关闭个性化
// 1、开关支持是否关闭个性化
if (!searchDynamicConfigService.isRecommendPersionalOpen()) {
paramMap.remove("uid");
}
// 1、获取核心参数
final int page = StringUtils.isBlank(paramMap.get("page")) ? 1 : Integer.parseInt(paramMap.get("page"));
final int count = StringUtils.isBlank(paramMap.get("viewNum")) ? 1 : Integer.parseInt(paramMap.get("viewNum"));
// 2、获取核心参数
int page = MapUtils.getIntValue(paramMap,"page",1);
int pageSize = MapUtils.getIntValue(paramMap,"viewNum",1);
// 1.1添加默认参数
// 3、添加默认参数
paramMap.remove(SearchRequestParams.PARAM_SEARCH_ORDER);// 此接口不支持order
paramMap.put(SearchRequestParams.PARAM_SEARCH_GLOBAL_FILTER_BRAND, "Y");// 页面屏蔽
paramMap.put(SearchRequestParams.PARAM_SEARCH_STATUS, "1");// 上架
... ... @@ -66,42 +58,20 @@ public class RecommendShopService extends AbstractCacheAbleService {
paramMap.put(SearchRequestParams.PARAM_SEARCH_ISOUTLETS, "2");// 非奥莱
paramMap.put(SearchRequestParams.PARAM_SEARCH_ATTRIBUTE_NOT, "2");// 非赠品
// 2、构建带queryBuilder和filter的SearchParam
// 4、构建SearchParam
SearchParam searchParam = searchParamHelper.buildWithPersional(paramMap, true);
// 3、构造聚合操作
IAggregation recommendShopAgg = aggregationFactory.getRecommendShopAggregation(paramMap, 100, 2);
searchParam.setAggregationBuilders(Arrays.asList(recommendShopAgg.getBuilder()));
// 4、构建offset
searchParam.setOffset(DEFAULT_AGGREGATION_COUNT);// justForCache
// 5、执行查询
JSONArray recommendShops = super.queryWithCache(searchParam, paramMap);
return this.getRecommendShopSearchApiResult(recommendShops, page, pageSize);
// 5、从缓存中获取
final String productIndexName = ISearchConstants.INDEX_NAME_PRODUCT_INDEX;
JSONArray cacheJSONArray = searchCacheService.getJSONArrayFromCache(searchCache, productIndexName, searchParam);
if (cacheJSONArray != null) {
SearchCacheMatchLogger.doSearchCacheMatchLog("/productindex/aggRecommendShop.json", paramMap);
return this.getRecommendShopSearchApiResult(cacheJSONArray, page, count);
}
// 6、从ES中获取
JSONObject recommendShopResult = aggregationsService.getAggNameAndResponse(recommendShopAgg, searchParam);
if (recommendShopResult == null) {
return new SearchApiResult().setData(500).setMessage("exception");
}
// 7、生成结果并且加入缓存
JSONArray recommendShops = recommendShopResult.getJSONArray(recommendShopAgg.aggName());
if (recommendShops != null) {
searchCacheService.addJSONArrayToCache(searchCache, productIndexName, searchParam, recommendShops);
return this.getRecommendShopSearchApiResult(recommendShops, page, count);
}
return new SearchApiResult().setData(new ArrayList<Map<String, Object>>());
} catch (Exception e) {
return SearchApiResultUtils.errorSearchApiResult(logger, paramMap, e);
}
}
private SearchApiResult getRecommendShopSearchApiResult(JSONArray cacheJSONArray, int page, int count) {
List<Map<String, Object>> cacheList = new ArrayList<Map<String, Object>>();
List<Map<String, Object>> cacheList = new ArrayList<>();
for (int i = 0; i < cacheJSONArray.size(); i++) {
cacheList.add(cacheJSONArray.getJSONObject(i));
}
... ... @@ -109,4 +79,32 @@ public class RecommendShopService extends AbstractCacheAbleService {
return new SearchApiResult().setData(results);
}
@Override
protected JSONArray doRealQuery(SearchParam searchParam, Map<String, String> paramMap) throws Exception {
// 1、构造聚合操作
IAggregation recommendShopAgg = aggregationFactory.getRecommendShopAggregation(paramMap, 100, 2);
searchParam.setAggregationBuilders(Arrays.asList(recommendShopAgg.getBuilder()));
// 2、构建offset
searchParam.setOffset(0);
// 3、执行查询
JSONObject recommendShopResult = aggregationsService.getAggNameAndResponse(recommendShopAgg, searchParam);
if (recommendShopResult == null) {
return new JSONArray();
}
// 4、生成结果
JSONArray recommendShops = recommendShopResult.getJSONArray(recommendShopAgg.aggName());
return recommendShops;
}
@Override
protected int cacheTimeInMinute() {
return CacheTimeConstants.CACHE_30_MINUTE;
}
@Override
protected String cacheSceneKey() {
return "RECOMMEND_SHOPS";
}
}
... ...