Authored by hugufei

优化collage代码

... ... @@ -103,6 +103,9 @@ public class SearchRequestParams {
// 店铺显示状态
public static final String PARAM_SEARCH_STORESHOWSTATUS = "storeShowStatus";
// 拼团活动id
public static final String PARAM_SEARCH_COLLAGE_ACTIVITYIDS = "collageActivityIds"; // 售卖类型
// helper index param
public static final String HELPER_PARAM_FIRSTCATEGORYID = "firstCategoryId";
public static final String HELPER_PARAM_SECENDCATEGORYID = "secendCategoryId";
... ... @@ -132,23 +135,6 @@ public class SearchRequestParams {
public static final String IMAGEREPERTORY_PARAM_ITEMTYPE = "itemType";
public static final String IMAGEREPERTORY_PARAM_PORT = "port";
//Collage index
public static final String COLLAGE_PARAM_ACTIVITYID = "activityId";
public static final String COLLAGE_PARAM_PRODUCTSKN = "productSkn";
public static final String COLLAGE_PARAM_ORDERBY = "orderBy";
public static final String COLLAGE_PARAM_OPENLIMIT = "openLimit";
public static final String COLLAGE_PARAM_JOINLIMIT = "joinLimit";
public static final String COLLAGE_PARAM_ISAUTO = "isAuto";
public static final String COLLAGE_PARAM_PAYLIMIT = "payLimit";
public static final String COLLAGE_PARAM_PRODUCTLIMIT = "productLimit";
public static final String COLLAGE_PARAM_STATUS = "status";
public static final String COLLAGE_PARAM_ACTIVITYSTATUS = "activityStatus";
public static final String COLLAGE_PARAM_BEGINTIME = "beginTime";
public static final String COLLAGE_PARAM_ENDTIME = "endTime";
public static final String COLLAGE_PARAM_COLLAGE_TOP_SKN = "collageTopSkn";
public static final String SHOPS_PARAM_CUSTOMIZE_TAG = "customize_tag";
... ...
... ... @@ -224,6 +224,9 @@ public class SearchQueryHelper {
this.addMustIntTermsQuery(boolFilter,paramMap,filterParamName,SearchRequestParams.PARAM_SEARCH_FILTER_POOLID,ProductIndexEsField.poolIds);
// 过滤hrShopIds
this.addMustIntTermsQuery(boolFilter,paramMap,filterParamName,SearchRequestParams.PARAM_SEARCH_HR_SHOP,ProductIndexEsField.hrShopIds);
// 过滤hrShopIds
this.addMustIntTermsQuery(boolFilter,paramMap,filterParamName,SearchRequestParams.PARAM_SEARCH_COLLAGE_ACTIVITYIDS,ProductIndexEsField.collageActivityIds);
// //////////////////////////////////////////支持传多个int参数,以逗号分隔,must_not///////////////////////////////////////////////////////////
... ...
package com.yoho.search.service.index;
import com.yoho.search.base.utils.DateUtil;
import com.yoho.search.base.utils.ISearchConstants;
import com.yoho.search.common.BaseService;
import com.yoho.search.common.SearchCommonService;
import com.yoho.search.core.es.model.SearchParam;
import com.yoho.search.core.es.model.SearchResult;
import org.apache.commons.collections.MapUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class CollageActivityIndexBaseService extends BaseService {
//Collage index
public static final String COLLAGE_PARAM_ACTIVITYID = "activityId";//支持过滤
public static final String COLLAGE_PARAM_OPENLIMIT = "openLimit";//支持过滤
public static final String COLLAGE_PARAM_JOINLIMIT = "joinLimit";//支持过滤
public static final String COLLAGE_PARAM_ISAUTO = "isAuto";//支持过滤
public static final String COLLAGE_PARAM_PAYLIMIT = "payLimit";//支持过滤
public static final String COLLAGE_PARAM_PRODUCTLIMIT = "productLimit";//支持过滤
public static final String COLLAGE_PARAM_PEOPLENUMLIMIT = "peopleNum";//拼团人数-支持过滤
private static final List<String> collageActivityParamsList = Arrays.asList(
COLLAGE_PARAM_ACTIVITYID,
COLLAGE_PARAM_OPENLIMIT,
COLLAGE_PARAM_JOINLIMIT,
COLLAGE_PARAM_ISAUTO,
COLLAGE_PARAM_PAYLIMIT,
COLLAGE_PARAM_PRODUCTLIMIT,
COLLAGE_PARAM_PEOPLENUMLIMIT);
@Autowired
private SearchCommonService searchCommonService;
private Map<String, Object> getCollageActivityInfo(Map<String, Object> esMap) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("activity_id", MapUtils.getIntValue(esMap, "activityId"));
map.put("people_num", MapUtils.getString(esMap, "peopleNum", ""));
return map;
}
/**
* 根据参数查询正在生效的活动信息
*
* @param paramMap
* @return
*/
public Map<Integer, Map<String, Object>> queryValidActivitys(Map<String, String> paramMap) {
SearchParam searchParam = new SearchParam();
BoolQueryBuilder boolFilter = QueryBuilders.boolQuery();
boolFilter.must(QueryBuilders.termQuery("status", 1));//过滤状态为1
boolFilter.must(QueryBuilders.rangeQuery("beginTime").lte(DateUtil.getCurrentTimeSecond()));//过滤活动开始时间
boolFilter.must(QueryBuilders.rangeQuery("endTime").gte(DateUtil.getCurrentTimeSecond()));//过滤活动结束时间
addTermQueryBatch(paramMap, boolFilter, collageActivityParamsList);
searchParam.setFiter(boolFilter);
searchParam.setOffset(0);
searchParam.setSize(100);
SearchResult searchResult = searchCommonService.doSearch(ISearchConstants.INDEX_NAME_COLLAGE_ACTIVITY, searchParam);
List<Map<String, Object>> collageActivitys = searchResult.getResultList();
Map<Integer, Map<String, Object>> result = new HashMap<>();
for (Map<String, Object> collageActivity : collageActivitys) {
Map<String, Object> bo = this.getCollageActivityInfo(collageActivity);
result.put(MapUtils.getIntValue(bo, "activity_id"), bo);
}
return result;
}
/**
* 查询全部正在生效的活动信息
*
* @return
*/
public Map<Integer, Map<String, Object>> queryValidActivitys() {
return queryValidActivitys(new HashMap<>());
}
}
... ...
package com.yoho.search.service.scene.others;
import com.alibaba.fastjson.JSONObject;
import com.yoho.search.base.utils.DateUtil;
import com.yoho.search.base.utils.ConvertUtils;
import com.yoho.search.base.utils.ISearchConstants;
import com.yoho.search.common.BaseService;
import com.yoho.search.base.utils.ProductIndexEsField;
import com.yoho.search.common.BaseSceneService;
import com.yoho.search.common.SearchCommonService;
import com.yoho.search.common.SearchRequestParams;
import com.yoho.search.common.utils.SearchApiResultUtils;
import com.yoho.search.core.es.model.SearchParam;
import com.yoho.search.core.es.model.SearchResult;
import com.yoho.search.models.SearchApiResult;
import com.yoho.search.service.recall.beans.cache.SknReturnInfoCacheBean;
import com.yoho.search.service.helper.SearchParamHelper;
import com.yoho.search.service.index.CollageActivityIndexBaseService;
import com.yoho.search.service.scorer.YohoFilterFunctionBuilders;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.common.lucene.search.function.CombineFunction;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
... ... @@ -35,35 +38,60 @@ import java.util.stream.Collectors;
* @version 2018/9/4
*/
@Service
public class CollageService extends BaseService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
public class CollageService extends BaseSceneService {
private static final List<String> paramsList = Arrays.asList(
SearchRequestParams.COLLAGE_PARAM_ACTIVITYID,
SearchRequestParams.COLLAGE_PARAM_PRODUCTSKN,
SearchRequestParams.COLLAGE_PARAM_ORDERBY,
SearchRequestParams.COLLAGE_PARAM_OPENLIMIT,
SearchRequestParams.COLLAGE_PARAM_JOINLIMIT,
SearchRequestParams.COLLAGE_PARAM_ISAUTO,
SearchRequestParams.COLLAGE_PARAM_PAYLIMIT,
SearchRequestParams.COLLAGE_PARAM_PRODUCTLIMIT);
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private SearchCommonService searchCommonService;
@Autowired
private SknReturnInfoCacheBean sknReturnInfoCacheBean;
private CollageActivityIndexBaseService collageActivityIndexBaseService;
@Autowired
private SearchParamHelper searchParamHelper;
private JSONObject buildReturnDataMap(long total, int page_size, int page_total, List<Map<String, Object>> list) {
JSONObject dataMap = new JSONObject();
dataMap.put("total", total);
dataMap.put("page_size", page_size);
dataMap.put("page_total", page_total);
dataMap.put("list", list);
return dataMap;
}
private List<Integer> topProductSkn(Map<String, String> paramMap){
return ConvertUtils.stringToIntList(paramMap.get(),",");
}
public SearchApiResult searchList(Map<String, String> paramMap) {
try {
logger.info("[class=CollageService][func=searchList][param={}][begin={}]", paramMap.toString(), System.currentTimeMillis());
SearchParam searchParam = new SearchParam();
// 1.构造查询参数
int pageSize = StringUtils.isBlank(paramMap.get("viewNum")) ? 10 : Integer.parseInt(paramMap.get("viewNum"));
int page = StringUtils.isBlank(paramMap.get("page")) ? 1 : Integer.parseInt(paramMap.get("page"));
if (page < 1 || pageSize < 0) {
return new SearchApiResult().setCode(400).setMessage("分页参数错误");
}
//2、查询正在生效的活动ids
Map<Integer, Map<String, Object>> validCollageActivitys = collageActivityIndexBaseService.queryValidActivitys(paramMap);
if (validCollageActivitys.isEmpty()) {
return new SearchApiResult().setData(buildReturnDataMap(0, pageSize, 0, new ArrayList<>())).setMessage("无正在生效的活动");
}
//3、构造pi索引参数
Map<String, String> productIndexFilter = new HashMap<>();
productIndexFilter.put(SearchRequestParams.PARAM_SEARCH_STATUS, "1");// 上架
productIndexFilter.put(SearchRequestParams.PARAM_SEARCH_STOCKNUM, "1");// 有库存
productIndexFilter.put(SearchRequestParams.PARAM_SEARCH_CONTAIN_FOBBIDEN, "Y");// 可以显示屏蔽商品
productIndexFilter.put(SearchRequestParams.PARAM_SEARCH_STORESHOWSTATUS, "1,2,5,6");// 排除不展示的商品
productIndexFilter.put(SearchRequestParams.PARAM_SEARCH_ISLIMITEDBUY, "N");// 不支持限购
productIndexFilter.put(SearchRequestParams.PARAM_SEARCH_ISDESPOSITADVANCE, "N");// 不支持定金预售
productIndexFilter.put(SearchRequestParams.PARAM_SEARCH_ISLIMITTIMEADVANCE, "N");// 不支持定金促销
productIndexFilter.put(SearchRequestParams.PARAM_SEARCH_COLLAGE_ACTIVITYIDS, StringUtils.join(validCollageActivitys.keySet(), ","));
//4、构造searchParam
SearchParam searchParam = searchParamHelper.buildDefault(productIndexFilter);
searchParam.setOffset((page - 1) * pageSize);
searchParam.setSize(pageSize > 100 ? 100 : pageSize);
... ... @@ -73,19 +101,16 @@ public class CollageService extends BaseService {
if (StringUtils.isNotBlank(firstSknStringList)) {
String[] firstSknArray = firstSknStringList.split(",");
firstProductSknList = Arrays.asList(firstSknArray);
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
QueryBuilder queryBuilder = searchParam.getQuery();
YohoFilterFunctionBuilders yohoFilterFunctionBuilders = new YohoFilterFunctionBuilders();
yohoFilterFunctionBuilders.add(QueryBuilders.termsQuery(SearchRequestParams.COLLAGE_PARAM_PRODUCTSKN, firstProductSknList), ScoreFunctionBuilders.weightFactorFunction(1000));
yohoFilterFunctionBuilders.add(QueryBuilders.termsQuery(ProductIndexEsField.productSkn, firstProductSknList), ScoreFunctionBuilders.weightFactorFunction(1000));
FunctionScoreQueryBuilder functionScoreQueryBuilder = new FunctionScoreQueryBuilder(queryBuilder, yohoFilterFunctionBuilders.getFilterFunctionBuilders());
functionScoreQueryBuilder.boostMode(CombineFunction.SUM);
searchParam.setQuery(functionScoreQueryBuilder);
}
//3.配置Filter
searchParam.setFiter(constructFilterBuilder(paramMap));
//4.查询ES
SearchResult searchResult = searchCommonService.doSearch(ISearchConstants.INDEX_NAME_COLLAGE, searchParam);
SearchResult searchResult = searchCommonService.doSearch(ISearchConstants.INDEX_NAME_PRODUCT_INDEX, searchParam);
SearchApiResult searchApiResult = new SearchApiResult();
if (searchResult == null) {
return searchApiResult.setCode(500);
... ... @@ -110,14 +135,14 @@ public class CollageService extends BaseService {
p.put("market_price", MapUtils.getDoubleValue(sknMap, "market_price"));
p.put("sales_num", MapUtils.getIntValue(sknMap, "sales_num"));
p.put("default_images", MapUtils.getString(sknMap, "default_images"));
p.put("is_seckill", MapUtils.getString(sknMap, "is_seckill"));
p.put("is_limitbuy", MapUtils.getString(sknMap, "is_limitbuy"));
p.put("is_deposit_advance", MapUtils.getString(sknMap, "is_deposit_advance"));
p.put("is_limitTime_advance", MapUtils.getString(sknMap, "is_limitTime_advance"));
p.put("storage_num", MapUtils.getString(sknMap, "storage_num"));
p.put("status", MapUtils.getString(sknMap, "status"));
p.put("is_fobbiden", MapUtils.getString(sknMap, "is_fobbiden"));
p.put("store_show_status", MapUtils.getString(sknMap, "store_show_status"));
// p.put("is_seckill", MapUtils.getString(sknMap, "is_seckill"));
// p.put("is_limitbuy", MapUtils.getString(sknMap, "is_limitbuy"));
// p.put("is_deposit_advance", MapUtils.getString(sknMap, "is_deposit_advance"));
// p.put("is_limitTime_advance", MapUtils.getString(sknMap, "is_limitTime_advance"));
// p.put("storage_num", MapUtils.getString(sknMap, "storage_num"));
// p.put("status", MapUtils.getString(sknMap, "status"));
// p.put("is_fobbiden", MapUtils.getString(sknMap, "is_fobbiden"));
// p.put("store_show_status", MapUtils.getString(sknMap, "store_show_status"));
});
List<Map<String, Object>> filteredCollageIndexResultList = new ArrayList<>();
collageIndexResultList.stream().forEach(p -> {
... ... @@ -157,59 +182,5 @@ public class CollageService extends BaseService {
}
}
private BoolQueryBuilder constructFilterBuilder(Map<String, String> paramMap) throws Exception {
BoolQueryBuilder boolFilter = QueryBuilders.boolQuery();
boolFilter.must(QueryBuilders.termQuery(SearchRequestParams.COLLAGE_PARAM_STATUS, 1));
boolFilter.must(QueryBuilders.termQuery(SearchRequestParams.COLLAGE_PARAM_ACTIVITYSTATUS, 1));
boolFilter.must(QueryBuilders.rangeQuery(SearchRequestParams.COLLAGE_PARAM_BEGINTIME).lte(DateUtil.getCurrentTimeSecond()));
boolFilter.must(QueryBuilders.rangeQuery(SearchRequestParams.COLLAGE_PARAM_ENDTIME).gte(DateUtil.getCurrentTimeSecond()));
addTermQueryBatch(paramMap, boolFilter, paramsList);
return boolFilter;
}
private List<Map<String, Object>> getIndexMap(List<Map<String, Object>> resultList, List<Integer> productSknList) {
List<Map<String, Object>> returnList = new ArrayList<Map<String, Object>>(resultList.size());
for (Map<String, Object> map : resultList) {
Map<String, Object> productMap = getIndexMap(map, productSknList);
returnList.add(productMap);
}
return returnList;
}
private Map<String, Object> getIndexMap(Map<String, Object> map, List<Integer> productSknList) {
Map<String, Object> resultMap = new HashMap<>(2);
Integer productSkn = MapUtils.getIntValue(map, "productSkn");
productSknList.add(productSkn);
resultMap.put("product_skn", productSkn);
resultMap.put("activity_id", MapUtils.getIntValue(map, "activityId"));
resultMap.put("people_num", MapUtils.getIntValue(map, "peopleNum", 0));
resultMap.put("collage_price", MapUtils.getDoubleValue(map, "collagePrice"));
return resultMap;
}
private boolean isShow(Map<String, Object> map) {
if (MapUtils.getString(map, "is_seckill").equals("Y")) {
return false;
}
if (MapUtils.getString(map, "is_limitbuy").equals("Y")) {
return false;
}
if (MapUtils.getString(map, "is_deposit_advance").equals("Y")) {
return false;
}
if (MapUtils.getString(map, "is_limitTime_advance").equals("Y")) {
return false;
}
if (MapUtils.getIntValue(map, "storage_num") == 0) {
return false;
}
if (MapUtils.getIntValue(map, "status") != 1) {
return false;
}
int storeShowStatus = MapUtils.getIntValue(map, "store_show_status");
if (storeShowStatus == 3 || storeShowStatus == 4) {
return false;
}
return true;
}
}
... ...