|
|
package com.yoho.search.recall.scene.beans.cache;
|
|
|
|
|
|
import com.yoho.search.base.utils.ISearchConstants;
|
|
|
import com.yoho.search.base.utils.ProductIndexEsField;
|
|
|
import com.yoho.search.core.es.model.SearchParam;
|
|
|
import com.yoho.search.core.es.model.SearchResult;
|
|
|
import com.yoho.search.recall.scene.beans.persional.PageProductIdBitSetComponent;
|
|
|
import com.yoho.search.recall.scene.beans.strategy.impls.RecommendSknStrategy;
|
|
|
import com.yoho.search.recall.scene.models.common.ParamQueryFilter;
|
|
|
import com.yoho.search.recall.scene.models.req.RecallRequest;
|
|
|
import com.yoho.search.recall.scene.models.req.RecallRequestResponse;
|
|
|
import com.yoho.search.recall.scene.models.req.RecallResponse;
|
|
|
import com.yoho.search.recall.scene.models.req.UserRecallRequest;
|
|
|
import com.yoho.search.service.base.SearchCommonService;
|
|
|
import org.apache.commons.collections.MapUtils;
|
|
|
import org.elasticsearch.index.query.BoolQueryBuilder;
|
|
|
import org.elasticsearch.index.query.QueryBuilders;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
@Component
|
|
|
public class SknRecallCacheBean{
|
|
|
|
|
|
@Autowired
|
|
|
private SearchCommonService searchCommonService;
|
|
|
@Autowired
|
|
|
private PageProductIdBitSetComponent pageProductIdBitSetComponent;
|
|
|
@Autowired
|
|
|
private SknBaseInfoCacheBean sknBaseInfoCacheBean;
|
|
|
|
|
|
/**
|
|
|
* 将推荐的skn构造成召回对象
|
|
|
*
|
|
|
* @return
|
|
|
*/
|
|
|
public List<RecallRequestResponse> batchRecallRecommedSknList(UserRecallRequest userRecallRequest,final List<Integer> recommedSknList) {
|
|
|
if(recommedSknList==null || recommedSknList.isEmpty()){
|
|
|
return new ArrayList<>();
|
|
|
}
|
|
|
List<Integer> filterSknList = this.filterRecommedSkn(userRecallRequest,recommedSknList);
|
|
|
return this.buildResults(userRecallRequest,filterSknList);
|
|
|
}
|
|
|
|
|
|
private List<Integer> filterRecommedSkn(UserRecallRequest userRecallRequest, List<Integer> recommedSknList){
|
|
|
//1、构造searchParam
|
|
|
ParamQueryFilter paramQueryFilter = userRecallRequest.getParamQueryFilter();
|
|
|
SearchParam searchParam = new SearchParam();
|
|
|
searchParam.setQuery(paramQueryFilter.getParamQuery());
|
|
|
BoolQueryBuilder realFilter = QueryBuilders.boolQuery();
|
|
|
realFilter.must(paramQueryFilter.getParamFilter());
|
|
|
realFilter.must(QueryBuilders.termsQuery(ProductIndexEsField.productSkn,recommedSknList));
|
|
|
searchParam.setFiter(realFilter);
|
|
|
|
|
|
//2、设置分页参数
|
|
|
searchParam.setOffset(0);
|
|
|
searchParam.setSize(recommedSknList.size());
|
|
|
searchParam.setIncludeFields(Arrays.asList(ProductIndexEsField.productSkn));
|
|
|
|
|
|
//3、执行查询
|
|
|
SearchResult searchResult = searchCommonService.doSearch(ISearchConstants.INDEX_NAME_PRODUCT_INDEX, searchParam);
|
|
|
|
|
|
//4、构建结果
|
|
|
List<Integer> recallSknList = new ArrayList<>();
|
|
|
List<Map<String, Object>> productList = searchResult.getResultList();
|
|
|
for (Map<String, Object> productInfo : productList) {
|
|
|
Integer productSkn = MapUtils.getInteger(productInfo, ProductIndexEsField.productSkn, 0);
|
|
|
recallSknList.add(productSkn);
|
|
|
}
|
|
|
return recallSknList;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 将推荐的skn构造成召回对象
|
|
|
* @return
|
|
|
*/
|
|
|
private List<RecallRequestResponse> buildResults(UserRecallRequest userRecallRequest,final List<Integer> recommedSknList){
|
|
|
List<RecallRequestResponse> results = new ArrayList<>();
|
|
|
if(recommedSknList==null || recommedSknList.isEmpty()){
|
|
|
return results;
|
|
|
}
|
|
|
ParamQueryFilter paramQueryFilter = userRecallRequest.getParamQueryFilter();
|
|
|
for (Integer recommendSkn : recommedSknList){
|
|
|
RecallRequest recallRequest = new RecallRequest(paramQueryFilter,new RecommendSknStrategy(recommendSkn));
|
|
|
RecallRequestResponse recallRequestResponse = new RecallRequestResponse(recallRequest);
|
|
|
recallRequestResponse.setResponse(new RecallResponse(1L, Arrays.asList(recommendSkn)),false);
|
|
|
results.add(recallRequestResponse);
|
|
|
}
|
|
|
return results;
|
|
|
}
|
|
|
|
|
|
} |
|
|
package com.yoho.search.recall.scene.beans.cache;
|
|
|
|
|
|
import com.yoho.search.base.utils.ISearchConstants;
|
|
|
import com.yoho.search.base.utils.ProductIndexEsField;
|
|
|
import com.yoho.search.core.es.model.SearchParam;
|
|
|
import com.yoho.search.core.es.model.SearchResult;
|
|
|
import com.yoho.search.recall.scene.beans.persional.PageProductIdBitSetComponent;
|
|
|
import com.yoho.search.recall.scene.beans.strategy.impls.RecommendSknStrategy;
|
|
|
import com.yoho.search.recall.scene.models.common.ParamQueryFilter;
|
|
|
import com.yoho.search.recall.scene.models.req.RecallRequest;
|
|
|
import com.yoho.search.recall.scene.models.req.RecallRequestResponse;
|
|
|
import com.yoho.search.recall.scene.models.req.RecallResponse;
|
|
|
import com.yoho.search.recall.scene.models.req.UserRecallRequest;
|
|
|
import com.yoho.search.service.base.SearchCommonService;
|
|
|
import org.apache.commons.collections.MapUtils;
|
|
|
import org.elasticsearch.index.query.BoolQueryBuilder;
|
|
|
import org.elasticsearch.index.query.QueryBuilders;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
@Component
|
|
|
public class SknRecallCacheBean{
|
|
|
|
|
|
@Autowired
|
|
|
private SearchCommonService searchCommonService;
|
|
|
@Autowired
|
|
|
private PageProductIdBitSetComponent pageProductIdBitSetComponent;
|
|
|
@Autowired
|
|
|
private SknBaseInfoCacheBean sknBaseInfoCacheBean;
|
|
|
|
|
|
/**
|
|
|
* 将推荐的skn构造成召回对象
|
|
|
*
|
|
|
* @return
|
|
|
*/
|
|
|
public List<RecallRequestResponse> batchRecallRecommedSknList(UserRecallRequest userRecallRequest,final List<Integer> recommedSknList) {
|
|
|
if(recommedSknList==null || recommedSknList.isEmpty()){
|
|
|
return new ArrayList<>();
|
|
|
}
|
|
|
List<Integer> filterSknList = this.filterRecommedSkn(userRecallRequest,recommedSknList);
|
|
|
return this.buildResults(userRecallRequest,filterSknList);
|
|
|
}
|
|
|
|
|
|
private List<Integer> filterRecommedSkn(UserRecallRequest userRecallRequest, List<Integer> recommedSknList){
|
|
|
//1、构造searchParam
|
|
|
ParamQueryFilter paramQueryFilter = userRecallRequest.getParamQueryFilter();
|
|
|
SearchParam searchParam = new SearchParam();
|
|
|
searchParam.setQuery(paramQueryFilter.getParamQuery());
|
|
|
BoolQueryBuilder realFilter = QueryBuilders.boolQuery();
|
|
|
realFilter.must(paramQueryFilter.getParamFilter());
|
|
|
realFilter.must(QueryBuilders.termsQuery(ProductIndexEsField.productSkn,recommedSknList));
|
|
|
searchParam.setFiter(realFilter);
|
|
|
|
|
|
//2、设置分页参数
|
|
|
searchParam.setOffset(0);
|
|
|
searchParam.setSize(recommedSknList.size());
|
|
|
searchParam.setIncludeFields(Arrays.asList(ProductIndexEsField.productSkn));
|
|
|
|
|
|
//3、执行查询
|
|
|
SearchResult searchResult = searchCommonService.doSearch(ISearchConstants.INDEX_NAME_PRODUCT_INDEX, searchParam);
|
|
|
|
|
|
//4、构建结果
|
|
|
List<Integer> recallSknList = new ArrayList<>();
|
|
|
List<Map<String, Object>> productList = searchResult.getResultList();
|
|
|
for (Map<String, Object> productInfo : productList) {
|
|
|
Integer productSkn = MapUtils.getInteger(productInfo, ProductIndexEsField.productSkn, 0);
|
|
|
recallSknList.add(productSkn);
|
|
|
}
|
|
|
return recallSknList;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 将推荐的skn构造成召回对象
|
|
|
* @return
|
|
|
*/
|
|
|
private List<RecallRequestResponse> buildResults(UserRecallRequest userRecallRequest,final List<Integer> recommedSknList){
|
|
|
List<RecallRequestResponse> results = new ArrayList<>();
|
|
|
if(recommedSknList==null || recommedSknList.isEmpty()){
|
|
|
return results;
|
|
|
}
|
|
|
ParamQueryFilter paramQueryFilter = userRecallRequest.getParamQueryFilter();
|
|
|
for (Integer recommendSkn : recommedSknList){
|
|
|
RecallRequest recallRequest = new RecallRequest(paramQueryFilter,new RecommendSknStrategy(recommendSkn));
|
|
|
RecallRequestResponse recallRequestResponse = new RecallRequestResponse(recallRequest);
|
|
|
recallRequestResponse.setResponse(new RecallResponse(1L, Arrays.asList(recommendSkn)),false);
|
|
|
results.add(recallRequestResponse);
|
|
|
}
|
|
|
return results;
|
|
|
}
|
|
|
|
|
|
} |
...
|
...
|
|