Showing
12 changed files
with
418 additions
and
842 deletions
service/src/main/java/com/yoho/search/recall/scene/beans/CacheRecallRequestResponse.java
deleted
100644 → 0
1 | -package com.yoho.search.recall.scene.beans; | ||
2 | - | ||
3 | -import com.alibaba.fastjson.JSON; | ||
4 | -import com.yoho.core.redis.cluster.operations.serializer.RedisKeyBuilder; | ||
5 | -import com.yoho.search.base.utils.Transfer; | ||
6 | -import com.yoho.search.recall.scene.cache.CacheRequestResponse; | ||
7 | -import com.yoho.search.recall.scene.models.RecallRequest; | ||
8 | -import com.yoho.search.recall.scene.models.RecallResponse; | ||
9 | - | ||
10 | -public class CacheRecallRequestResponse extends CacheRequestResponse<RecallRequest,RecallResponse> { | ||
11 | - | ||
12 | - public CacheRecallRequestResponse(RecallRequest request) { | ||
13 | - super(request); | ||
14 | - } | ||
15 | - | ||
16 | - @Override | ||
17 | - public Transfer<String, RecallResponse> getToResponseTransfer() { | ||
18 | - return toResponseTransfer; | ||
19 | - } | ||
20 | - | ||
21 | - @Override | ||
22 | - public Transfer<RecallResponse, String> getFromResponseTransfer() { | ||
23 | - return fromResponseTransfer; | ||
24 | - } | ||
25 | - | ||
26 | - private static Transfer<String,RecallResponse> toResponseTransfer = new Transfer<String, RecallResponse>() { | ||
27 | - @Override | ||
28 | - public RecallResponse transfer(String jsonValue) { | ||
29 | - return JSON.parseObject(jsonValue, RecallResponse.class); | ||
30 | - } | ||
31 | - }; | ||
32 | - | ||
33 | - private static Transfer<RecallResponse,String> fromResponseTransfer = new Transfer<RecallResponse, String>() { | ||
34 | - @Override | ||
35 | - public String transfer(RecallResponse recallResponse) { | ||
36 | - return JSON.toJSONString(recallResponse); | ||
37 | - } | ||
38 | - }; | ||
39 | -} |
service/src/main/java/com/yoho/search/recall/scene/beans/CacheRecallRequestResponseBean.java
deleted
100644 → 0
1 | -package com.yoho.search.recall.scene.beans; | ||
2 | - | ||
3 | -import com.yoho.search.base.utils.ISearchConstants; | ||
4 | -import com.yoho.search.base.utils.ProductIndexEsField; | ||
5 | -import com.yoho.search.core.es.model.SearchParam; | ||
6 | -import com.yoho.search.core.es.model.SearchResult; | ||
7 | -import com.yoho.search.recall.scene.cache.CacheRequestResponseComponent; | ||
8 | -import com.yoho.search.recall.scene.models.RecallRequest; | ||
9 | -import com.yoho.search.recall.scene.models.RecallResponse; | ||
10 | -import com.yoho.search.recall.scene.models.RecallSknParams; | ||
11 | -import com.yoho.search.recall.scene.models.RecallSknResult; | ||
12 | -import com.yoho.search.service.base.SearchCommonService; | ||
13 | -import org.apache.commons.collections.MapUtils; | ||
14 | -import org.slf4j.Logger; | ||
15 | -import org.slf4j.LoggerFactory; | ||
16 | -import org.springframework.beans.factory.annotation.Autowired; | ||
17 | -import org.springframework.stereotype.Component; | ||
18 | - | ||
19 | -import java.util.ArrayList; | ||
20 | -import java.util.HashMap; | ||
21 | -import java.util.List; | ||
22 | -import java.util.Map; | ||
23 | - | ||
24 | -@Component | ||
25 | -public class CacheRecallRequestResponseBean extends CacheRequestResponseComponent<RecallRequest,RecallResponse,CacheRecallRequestResponse>{ | ||
26 | - | ||
27 | - @Autowired | ||
28 | - private SearchCommonService searchCommonService; | ||
29 | - | ||
30 | - private static final int maxEsRequestCountPerTime = 10; | ||
31 | - | ||
32 | - /** | ||
33 | - * 批量召回入口 | ||
34 | - * | ||
35 | - * @param batchRequests | ||
36 | - * @return | ||
37 | - */ | ||
38 | - public List<CacheRecallRequestResponse> batchRecallAndCache(final List<RecallRequest> batchRequests) { | ||
39 | - //1、构造请求 | ||
40 | - final List<CacheRecallRequestResponse> results = new ArrayList<>(); | ||
41 | - for (RecallRequest request : batchRequests) { | ||
42 | - results.add(new CacheRecallRequestResponse(request)); | ||
43 | - } | ||
44 | - //2、执行查询 | ||
45 | - this.bacthFillResponseWithCache(results,false); | ||
46 | - | ||
47 | - //3、返回结果 | ||
48 | - return results; | ||
49 | - } | ||
50 | - | ||
51 | - @Override | ||
52 | - public Map<RecallRequest, RecallResponse> queryMissCacheRequestResults(List<CacheRecallRequestResponse> missCacheRequests) { | ||
53 | - //1、构造请求参数 | ||
54 | - List<SearchParam> searchParams = new ArrayList<>(); | ||
55 | - for (CacheRecallRequestResponse requestResponse : missCacheRequests) { | ||
56 | - searchParams.add(requestResponse.getRequest().searchParam()); | ||
57 | - //控制每次请求es的数量 | ||
58 | - if(searchParams.size()>=maxEsRequestCountPerTime){ | ||
59 | - break; | ||
60 | - } | ||
61 | - } | ||
62 | - //2、执行搜索 | ||
63 | - List<SearchResult> searchResults = searchCommonService.doMutiSearch(ISearchConstants.INDEX_NAME_PRODUCT_INDEX, searchParams); | ||
64 | - //3、构造返回结果 | ||
65 | - Map<RecallRequest,RecallResponse> notCachedResults = new HashMap<>(); | ||
66 | - for (int i = 0; i < missCacheRequests.size(); i++) { | ||
67 | - RecallRequest request = missCacheRequests.get(i).getRequest(); | ||
68 | - SearchResult searchResult = searchResults.get(i); | ||
69 | - RecallResponse response = this.buildResonse(searchResult); | ||
70 | - notCachedResults.put(request,response); | ||
71 | - } | ||
72 | - return notCachedResults; | ||
73 | - } | ||
74 | - | ||
75 | - private RecallResponse buildResonse(SearchResult searchResult) { | ||
76 | - List<Map<String, Object>> results = searchResult.getResultList(); | ||
77 | - List<RecallResponse.RecallSkn> recallSkns = new ArrayList<>(); | ||
78 | - for (Map<String, Object> result : results) { | ||
79 | - Integer productSkn = MapUtils.getInteger(result, ProductIndexEsField.productSkn, 0); | ||
80 | - Integer brandId = MapUtils.getInteger(result, ProductIndexEsField.brandId, 0); | ||
81 | - Integer middleSortId = MapUtils.getInteger(result, ProductIndexEsField.middleSortId, 0); | ||
82 | - recallSkns.add(new RecallResponse.RecallSkn(productSkn, brandId, middleSortId)); | ||
83 | - } | ||
84 | - return new RecallResponse(searchResult.getTotal(), recallSkns); | ||
85 | - } | ||
86 | - | ||
87 | -} |
service/src/main/java/com/yoho/search/recall/scene/beans/CacheRecallSknRequestResponse.java
deleted
100644 → 0
1 | -package com.yoho.search.recall.scene.beans; | ||
2 | - | ||
3 | -import com.alibaba.fastjson.JSON; | ||
4 | -import com.yoho.search.base.utils.Transfer; | ||
5 | -import com.yoho.search.recall.scene.cache.CacheRequestResponse; | ||
6 | -import com.yoho.search.recall.scene.models.RecallSknParams; | ||
7 | -import com.yoho.search.recall.scene.models.RecallSknResult; | ||
8 | - | ||
9 | -public class CacheRecallSknRequestResponse extends CacheRequestResponse<RecallSknParams,RecallSknResult> { | ||
10 | - | ||
11 | - public CacheRecallSknRequestResponse(RecallSknParams request) { | ||
12 | - super(request); | ||
13 | - } | ||
14 | - | ||
15 | - private static Transfer<String,RecallSknResult> toResponseTransfer = new Transfer<String, RecallSknResult>() { | ||
16 | - @Override | ||
17 | - public RecallSknResult transfer(String jsonValue) { | ||
18 | - return JSON.parseObject(jsonValue, RecallSknResult.class); | ||
19 | - } | ||
20 | - }; | ||
21 | - | ||
22 | - private static Transfer<RecallSknResult,String> fromResponseTransfer = new Transfer<RecallSknResult, String>() { | ||
23 | - @Override | ||
24 | - public String transfer(RecallSknResult recallSknResult) { | ||
25 | - return JSON.toJSONString(recallSknResult); | ||
26 | - } | ||
27 | - }; | ||
28 | - | ||
29 | - @Override | ||
30 | - public Transfer<String, RecallSknResult> getToResponseTransfer() { | ||
31 | - return toResponseTransfer; | ||
32 | - } | ||
33 | - | ||
34 | - @Override | ||
35 | - public Transfer<RecallSknResult, String> getFromResponseTransfer() { | ||
36 | - return fromResponseTransfer; | ||
37 | - } | ||
38 | -} |
1 | -package com.yoho.search.recall.scene.beans; | ||
2 | - | ||
3 | -import com.yoho.search.recall.scene.builder.request.BrandRecallRequestBuilder; | ||
4 | -import com.yoho.search.recall.scene.builder.request.CommonRecallRequestBuilder; | ||
5 | -import com.yoho.search.recall.scene.builder.request.SortPriceRecallRequestBuilder; | ||
6 | -import com.yoho.search.recall.scene.builder.response.RecallResponseBatchBuilder; | ||
7 | -import com.yoho.search.recall.scene.builder.response.RecallSknResultBuilder; | ||
8 | -import com.yoho.search.recall.scene.cache.CacheRequestResponseComponent; | ||
9 | -import com.yoho.search.recall.scene.models.RecallRequest; | ||
10 | -import com.yoho.search.recall.scene.models.RecallResponseBatch; | ||
11 | -import com.yoho.search.recall.scene.models.RecallSknParams; | ||
12 | -import com.yoho.search.recall.scene.models.RecallSknResult; | ||
13 | -import com.yoho.search.recall.scene.persional.PersionalFactor; | ||
14 | -import com.yoho.search.recall.scene.persional.RecallPersionalService; | ||
15 | -import org.springframework.beans.factory.annotation.Autowired; | ||
16 | -import org.springframework.stereotype.Component; | ||
17 | - | ||
18 | -import java.util.ArrayList; | ||
19 | -import java.util.HashMap; | ||
20 | -import java.util.List; | ||
21 | -import java.util.Map; | ||
22 | - | ||
23 | -@Component | ||
24 | -public class CacheRecallSknRequestResponseBean extends CacheRequestResponseComponent<RecallSknParams,RecallSknResult,CacheRecallSknRequestResponse>{ | ||
25 | - | ||
26 | - @Autowired | ||
27 | - private RecallPersionalService recallPersionalService; | ||
28 | - @Autowired | ||
29 | - private CacheRecallRequestResponseBean cacheRecallRequestResponseBean; | ||
30 | - @Autowired | ||
31 | - private RecallResponseBatchBuilder recallResponseBatchBuilder; | ||
32 | - @Autowired | ||
33 | - private RecallSknResultBuilder recallSknResultBuilder; | ||
34 | - @Autowired | ||
35 | - private CommonRecallRequestBuilder commonRequestBuilder; | ||
36 | - @Autowired | ||
37 | - private BrandRecallRequestBuilder brandRequestBuilder; | ||
38 | - @Autowired | ||
39 | - private SortPriceRecallRequestBuilder sortPriceRequestBuilder; | ||
40 | - | ||
41 | - /** | ||
42 | - * 召回入口 | ||
43 | - * @param recallSknParams | ||
44 | - * @return | ||
45 | - */ | ||
46 | - public RecallSknResult doRecallSknResult(RecallSknParams recallSknParams){ | ||
47 | - //1、构建请求 | ||
48 | - List<CacheRecallSknRequestResponse> requests = new ArrayList<>(); | ||
49 | - requests.add(new CacheRecallSknRequestResponse(recallSknParams)); | ||
50 | - | ||
51 | - //2、执行父类方法 | ||
52 | - this.bacthFillResponseWithCache(requests,false); | ||
53 | - | ||
54 | - //3、判断 | ||
55 | - if(requests.size()==1 && requests.get(0).getResponse()!=null){ | ||
56 | - return requests.get(0).getResponse(); | ||
57 | - } | ||
58 | - return null; | ||
59 | - } | ||
60 | - | ||
61 | - @Override | ||
62 | - public Map<RecallSknParams, RecallSknResult> queryMissCacheRequestResults(List<CacheRecallSknRequestResponse> missCachseRequests) { | ||
63 | - Map<RecallSknParams, RecallSknResult> results = new HashMap<>(); | ||
64 | - for (CacheRecallSknRequestResponse request: missCachseRequests) { | ||
65 | - RecallSknResult response = this.doRealRecall(request.getRequest()); | ||
66 | - results.put(request.getRequest(),response); | ||
67 | - } | ||
68 | - return results; | ||
69 | - } | ||
70 | - | ||
71 | - /** | ||
72 | - * 真正的召回入口 | ||
73 | - * @param param | ||
74 | - * @return | ||
75 | - */ | ||
76 | - private RecallSknResult doRealRecall(RecallSknParams param) { | ||
77 | - //1、获取个性化因子 | ||
78 | - PersionalFactor persionalFactor = recallPersionalService.queryPersionalFactor(param); | ||
79 | - //2、构造请求 | ||
80 | - List<RecallRequest> batchRequests = this.buildBatchRequests(param, persionalFactor); | ||
81 | - //3、批量召回 | ||
82 | - List<CacheRecallRequestResponse> requestResponses = cacheRecallRequestResponseBean.batchRecallAndCache(batchRequests); | ||
83 | - //4、获取skn列表[去重] | ||
84 | - RecallResponseBatch recallResponseBatch = recallResponseBatchBuilder.buildRecallResponseBatch(requestResponses); | ||
85 | - //5、构造真实结果[排序,截取skn] | ||
86 | - RecallSknResult recallSknResult = recallSknResultBuilder.builderRecallResult(recallResponseBatch, param, persionalFactor); | ||
87 | - return recallSknResult; | ||
88 | - } | ||
89 | - | ||
90 | - /** | ||
91 | - * 批量构造请求 | ||
92 | - * @param param | ||
93 | - * @param persionalFactor | ||
94 | - * @return | ||
95 | - */ | ||
96 | - private List<RecallRequest> buildBatchRequests(RecallSknParams param, PersionalFactor persionalFactor) { | ||
97 | - //1、构造召回请求 | ||
98 | - List<RecallRequest> allRequests = new ArrayList<>(); | ||
99 | - //2、构造非个性化的请求 | ||
100 | - List<RecallRequest> commonRequests = commonRequestBuilder.buildCommonRecallRequests(param.getParamQueryFilter(), param.getFirstProductSkns()); | ||
101 | - allRequests.addAll(commonRequests); | ||
102 | - //4、构建个性化品牌的召回请求 | ||
103 | - List<RecallRequest> brandRequests = brandRequestBuilder.buildBrandRecallRequests(param.getParamQueryFilter(), persionalFactor.getBrandIds()); | ||
104 | - allRequests.addAll(brandRequests); | ||
105 | - //5、构建个性化品牌的召回请求 | ||
106 | - List<RecallRequest> sortPriceRequests = sortPriceRequestBuilder.buildSortPriceRecallRequests(param.getParamQueryFilter(), persionalFactor.getSortPriceAreas()); | ||
107 | - allRequests.addAll(sortPriceRequests); | ||
108 | - return allRequests; | ||
109 | - } | ||
110 | - | ||
111 | - | ||
112 | -} |
service/src/main/java/com/yoho/search/recall/scene/beans/CacheSknInfoRequestResponse.java
deleted
100644 → 0
1 | -package com.yoho.search.recall.scene.beans; | ||
2 | - | ||
3 | -import com.alibaba.fastjson.JSON; | ||
4 | -import com.alibaba.fastjson.JSONObject; | ||
5 | -import com.yoho.core.redis.cluster.operations.serializer.RedisKeyBuilder; | ||
6 | -import com.yoho.search.base.utils.Transfer; | ||
7 | -import com.yoho.search.recall.scene.cache.CacheRequestResponse; | ||
8 | -import com.yoho.search.recall.scene.models.SknInfoRequest; | ||
9 | - | ||
10 | -import java.util.HashMap; | ||
11 | -import java.util.Map; | ||
12 | - | ||
13 | -public class CacheSknInfoRequestResponse extends CacheRequestResponse<SknInfoRequest, Map<String, Object>> { | ||
14 | - | ||
15 | - public CacheSknInfoRequestResponse(SknInfoRequest sknInfoRequest) { | ||
16 | - super(sknInfoRequest); | ||
17 | - } | ||
18 | - | ||
19 | - static Transfer<String, Map<String, Object>> toResponseTransfer = new Transfer<String, Map<String, Object>>() { | ||
20 | - @Override | ||
21 | - public Map<String, Object> transfer(String value) { | ||
22 | - Map<String, Object> product = new HashMap<>(); | ||
23 | - product.putAll(JSONObject.parseObject(value)); | ||
24 | - return product; | ||
25 | - } | ||
26 | - }; | ||
27 | - | ||
28 | - static Transfer<Map<String, Object>, String> fromResponseTransfer = new Transfer<Map<String, Object>, String>() { | ||
29 | - @Override | ||
30 | - public String transfer(Map<String, Object> product) { | ||
31 | - return JSON.toJSONString(product); | ||
32 | - } | ||
33 | - }; | ||
34 | - | ||
35 | - @Override | ||
36 | - public Transfer<String, Map<String, Object>> getToResponseTransfer() { | ||
37 | - return toResponseTransfer; | ||
38 | - } | ||
39 | - | ||
40 | - @Override | ||
41 | - public Transfer<Map<String, Object>, String> getFromResponseTransfer() { | ||
42 | - return fromResponseTransfer; | ||
43 | - } | ||
44 | -} |
1 | -package com.yoho.search.recall.scene.beans; | ||
2 | - | ||
3 | - | ||
4 | -import com.yoho.search.base.utils.ISearchConstants; | ||
5 | -import com.yoho.search.base.utils.ProductIndexEsField; | ||
6 | -import com.yoho.search.core.es.model.SearchParam; | ||
7 | -import com.yoho.search.core.es.model.SearchResult; | ||
8 | -import com.yoho.search.recall.scene.cache.CacheRequestResponseComponent; | ||
9 | -import com.yoho.search.recall.scene.models.RecallSknParams; | ||
10 | -import com.yoho.search.recall.scene.models.RecallSknResult; | ||
11 | -import com.yoho.search.recall.scene.models.SknInfoRequest; | ||
12 | -import com.yoho.search.service.base.SearchCommonService; | ||
13 | -import com.yoho.search.service.base.index.ProductIndexBaseService; | ||
14 | -import org.apache.commons.collections.MapUtils; | ||
15 | -import org.elasticsearch.index.query.QueryBuilders; | ||
16 | -import org.springframework.beans.factory.annotation.Autowired; | ||
17 | -import org.springframework.stereotype.Component; | ||
18 | - | ||
19 | -import java.util.ArrayList; | ||
20 | -import java.util.HashMap; | ||
21 | -import java.util.List; | ||
22 | -import java.util.Map; | ||
23 | - | ||
24 | -@Component | ||
25 | -public class CacheSknInfoRequestResponseBean extends CacheRequestResponseComponent<SknInfoRequest,Map<String, Object>,CacheSknInfoRequestResponse>{ | ||
26 | - | ||
27 | - @Autowired | ||
28 | - private SearchCommonService searchCommonService; | ||
29 | - @Autowired | ||
30 | - private ProductIndexBaseService productIndexBaseService; | ||
31 | - | ||
32 | - /** | ||
33 | - * 按skn查询并按顺序返回 | ||
34 | - * | ||
35 | - * @param productSkns | ||
36 | - * @return | ||
37 | - */ | ||
38 | - public List<Map<String, Object>> queryProductListBySkn(List<Integer> productSkns,int size){ | ||
39 | - //1、批量查询SKN信息 | ||
40 | - List<CacheSknInfoRequestResponse> sknInfoCacheRequestRespons = this.batchQuery(productSkns); | ||
41 | - //2、构造返回结果 | ||
42 | - List<Map<String, Object>> finalResults = new ArrayList<>(); | ||
43 | - for (CacheSknInfoRequestResponse sknInfoCacheRequestResponse : sknInfoCacheRequestRespons) { | ||
44 | - if(sknInfoCacheRequestResponse !=null && sknInfoCacheRequestResponse.getResponse()!=null){ | ||
45 | - finalResults.add(sknInfoCacheRequestResponse.getResponse()); | ||
46 | - } | ||
47 | - if(finalResults.size()>=size){ | ||
48 | - break; | ||
49 | - } | ||
50 | - } | ||
51 | - return finalResults; | ||
52 | - } | ||
53 | - | ||
54 | - private List<CacheSknInfoRequestResponse> batchQuery(List<Integer> productSkns){ | ||
55 | - //1、构建请求与返回结果 | ||
56 | - final List<CacheSknInfoRequestResponse> requests = new ArrayList<>(); | ||
57 | - for (Integer productSkn : productSkns) { | ||
58 | - requests.add(new CacheSknInfoRequestResponse(new SknInfoRequest(productSkn))); | ||
59 | - } | ||
60 | - //2、调父类方法 | ||
61 | - this.bacthFillResponseWithCache(requests,true); | ||
62 | - | ||
63 | - //3、返回结果 | ||
64 | - return requests; | ||
65 | - } | ||
66 | - | ||
67 | - @Override | ||
68 | - public Map<SknInfoRequest, Map<String, Object>> queryMissCacheRequestResults(List<CacheSknInfoRequestResponse> missCacheRequests) { | ||
69 | - //1、合法性判断 | ||
70 | - Map<SknInfoRequest,Map<String, Object>> results = new HashMap<>(); | ||
71 | - if(missCacheRequests==null||missCacheRequests.isEmpty()){ | ||
72 | - return results; | ||
73 | - } | ||
74 | - //2、获取skn | ||
75 | - List<Integer> productSkns = new ArrayList<>(); | ||
76 | - for (CacheSknInfoRequestResponse sknInfoCacheRequestResponse : missCacheRequests) { | ||
77 | - productSkns.add(sknInfoCacheRequestResponse.getRequest().getProductSkn()); | ||
78 | - } | ||
79 | - //3、构建SearchParam | ||
80 | - SearchParam searchParam = new SearchParam(); | ||
81 | - searchParam.setOffset(0); | ||
82 | - searchParam.setSize(productSkns.size()); | ||
83 | - searchParam.setFiter(QueryBuilders.termsQuery(ProductIndexEsField.productSkn, productSkns)); | ||
84 | - searchParam.setIncludeFields(productIndexBaseService.getProductIndexIncludeFields()); | ||
85 | - SearchResult searchResult = searchCommonService.doSearch(ISearchConstants.INDEX_NAME_PRODUCT_INDEX, searchParam); | ||
86 | - List<Map<String, Object>> productList = productIndexBaseService.getProductListWithPricePlan(searchResult.getResultList()); | ||
87 | - //4、构建SKN临时结果 | ||
88 | - Map<Integer,Map<String, Object>> productTempMap = new HashMap<>(); | ||
89 | - for (Map<String, Object> product: productList) { | ||
90 | - productTempMap.put(MapUtils.getIntValue(product,"product_skn",0),product); | ||
91 | - } | ||
92 | - //5、构造最终结果 | ||
93 | - for (CacheSknInfoRequestResponse requestResponse :missCacheRequests ) { | ||
94 | - results.put(requestResponse.getRequest(),productTempMap.get(requestResponse.getRequest().getProductSkn())); | ||
95 | - } | ||
96 | - return results; | ||
97 | - } | ||
98 | - | ||
99 | - | ||
100 | - | ||
101 | - | ||
102 | - | ||
103 | - | ||
104 | -} |
1 | -package com.yoho.search.recall.scene.cache.beans; | ||
2 | - | ||
3 | -import com.alibaba.fastjson.JSON; | ||
4 | -import com.yoho.core.redis.cluster.operations.serializer.RedisKeyBuilder; | ||
5 | -import com.yoho.search.base.utils.Transfer; | ||
6 | -import com.yoho.search.recall.scene.cache.CacheRequestResponse; | ||
7 | -import com.yoho.search.recall.scene.models.RecallRequest; | ||
8 | -import com.yoho.search.recall.scene.models.RecallResponse; | ||
9 | - | ||
10 | -public class CacheRecallRequestResponse extends CacheRequestResponse<RecallRequest,RecallResponse> { | ||
11 | - | ||
12 | - public CacheRecallRequestResponse(RecallRequest request) { | ||
13 | - super(request); | ||
14 | - } | ||
15 | - | ||
16 | - @Override | ||
17 | - public Transfer<String, RecallResponse> getToResponseTransfer() { | ||
18 | - return toResponseTransfer; | ||
19 | - } | ||
20 | - | ||
21 | - @Override | ||
22 | - public Transfer<RecallResponse, String> getFromResponseTransfer() { | ||
23 | - return fromResponseTransfer; | ||
24 | - } | ||
25 | - | ||
26 | - private static Transfer<String,RecallResponse> toResponseTransfer = new Transfer<String, RecallResponse>() { | ||
27 | - @Override | ||
28 | - public RecallResponse transfer(String jsonValue) { | ||
29 | - return JSON.parseObject(jsonValue, RecallResponse.class); | ||
30 | - } | ||
31 | - }; | ||
32 | - | ||
33 | - private static Transfer<RecallResponse,String> fromResponseTransfer = new Transfer<RecallResponse, String>() { | ||
34 | - @Override | ||
35 | - public String transfer(RecallResponse recallResponse) { | ||
36 | - return JSON.toJSONString(recallResponse); | ||
37 | - } | ||
38 | - }; | ||
39 | -} | 1 | +package com.yoho.search.recall.scene.cache.beans; |
2 | + | ||
3 | +import com.alibaba.fastjson.JSON; | ||
4 | +import com.yoho.core.redis.cluster.operations.serializer.RedisKeyBuilder; | ||
5 | +import com.yoho.search.base.utils.Transfer; | ||
6 | +import com.yoho.search.recall.scene.cache.CacheRequestResponse; | ||
7 | +import com.yoho.search.recall.scene.models.RecallRequest; | ||
8 | +import com.yoho.search.recall.scene.models.RecallResponse; | ||
9 | + | ||
10 | +public class CacheRecallRequestResponse extends CacheRequestResponse<RecallRequest,RecallResponse> { | ||
11 | + | ||
12 | + public CacheRecallRequestResponse(RecallRequest request) { | ||
13 | + super(request); | ||
14 | + } | ||
15 | + | ||
16 | + @Override | ||
17 | + public Transfer<String, RecallResponse> getToResponseTransfer() { | ||
18 | + return toResponseTransfer; | ||
19 | + } | ||
20 | + | ||
21 | + @Override | ||
22 | + public Transfer<RecallResponse, String> getFromResponseTransfer() { | ||
23 | + return fromResponseTransfer; | ||
24 | + } | ||
25 | + | ||
26 | + private static Transfer<String,RecallResponse> toResponseTransfer = new Transfer<String, RecallResponse>() { | ||
27 | + @Override | ||
28 | + public RecallResponse transfer(String jsonValue) { | ||
29 | + return JSON.parseObject(jsonValue, RecallResponse.class); | ||
30 | + } | ||
31 | + }; | ||
32 | + | ||
33 | + private static Transfer<RecallResponse,String> fromResponseTransfer = new Transfer<RecallResponse, String>() { | ||
34 | + @Override | ||
35 | + public String transfer(RecallResponse recallResponse) { | ||
36 | + return JSON.toJSONString(recallResponse); | ||
37 | + } | ||
38 | + }; | ||
39 | +} |
1 | -package com.yoho.search.recall.scene.cache.beans; | ||
2 | - | ||
3 | -import com.yoho.search.base.utils.ISearchConstants; | ||
4 | -import com.yoho.search.base.utils.ProductIndexEsField; | ||
5 | -import com.yoho.search.core.es.model.SearchParam; | ||
6 | -import com.yoho.search.core.es.model.SearchResult; | ||
7 | -import com.yoho.search.recall.scene.cache.CacheRequestResponseComponent; | ||
8 | -import com.yoho.search.recall.scene.models.RecallRequest; | ||
9 | -import com.yoho.search.recall.scene.models.RecallResponse; | ||
10 | -import com.yoho.search.service.base.SearchCommonService; | ||
11 | -import org.apache.commons.collections.MapUtils; | ||
12 | -import org.springframework.beans.factory.annotation.Autowired; | ||
13 | -import org.springframework.stereotype.Component; | ||
14 | - | ||
15 | -import java.util.ArrayList; | ||
16 | -import java.util.HashMap; | ||
17 | -import java.util.List; | ||
18 | -import java.util.Map; | ||
19 | - | ||
20 | -@Component | ||
21 | -public class CacheRecallRequestResponseBean extends CacheRequestResponseComponent<RecallRequest,RecallResponse,CacheRecallRequestResponse>{ | ||
22 | - | ||
23 | - @Autowired | ||
24 | - private SearchCommonService searchCommonService; | ||
25 | - | ||
26 | - private static final int maxEsRequestCountPerTime = 10; | ||
27 | - | ||
28 | - /** | ||
29 | - * 批量召回入口 | ||
30 | - * | ||
31 | - * @param batchRequests | ||
32 | - * @return | ||
33 | - */ | ||
34 | - public List<CacheRecallRequestResponse> batchRecallAndCache(final List<RecallRequest> batchRequests) { | ||
35 | - //1、构造请求 | ||
36 | - final List<CacheRecallRequestResponse> results = new ArrayList<>(); | ||
37 | - for (RecallRequest request : batchRequests) { | ||
38 | - results.add(new CacheRecallRequestResponse(request)); | ||
39 | - } | ||
40 | - //2、执行查询 | ||
41 | - this.bacthFillResponseWithCache(results,false); | ||
42 | - | ||
43 | - //3、返回结果 | ||
44 | - return results; | ||
45 | - } | ||
46 | - | ||
47 | - @Override | ||
48 | - public Map<RecallRequest, RecallResponse> queryMissCacheRequestResults(List<CacheRecallRequestResponse> missCacheRequests) { | ||
49 | - //1、构造请求参数 | ||
50 | - List<SearchParam> searchParams = new ArrayList<>(); | ||
51 | - for (CacheRecallRequestResponse requestResponse : missCacheRequests) { | ||
52 | - searchParams.add(requestResponse.getRequest().searchParam()); | ||
53 | - //控制每次请求es的数量 | ||
54 | - if(searchParams.size()>=maxEsRequestCountPerTime){ | ||
55 | - break; | ||
56 | - } | ||
57 | - } | ||
58 | - //2、执行搜索 | ||
59 | - List<SearchResult> searchResults = searchCommonService.doMutiSearch(ISearchConstants.INDEX_NAME_PRODUCT_INDEX, searchParams); | ||
60 | - //3、构造返回结果 | ||
61 | - Map<RecallRequest,RecallResponse> notCachedResults = new HashMap<>(); | ||
62 | - for (int i = 0; i < missCacheRequests.size(); i++) { | ||
63 | - RecallRequest request = missCacheRequests.get(i).getRequest(); | ||
64 | - SearchResult searchResult = searchResults.get(i); | ||
65 | - RecallResponse response = this.buildResonse(searchResult); | ||
66 | - notCachedResults.put(request,response); | ||
67 | - } | ||
68 | - return notCachedResults; | ||
69 | - } | ||
70 | - | ||
71 | - private RecallResponse buildResonse(SearchResult searchResult) { | ||
72 | - List<Map<String, Object>> results = searchResult.getResultList(); | ||
73 | - List<RecallResponse.RecallSkn> recallSkns = new ArrayList<>(); | ||
74 | - for (Map<String, Object> result : results) { | ||
75 | - Integer productSkn = MapUtils.getInteger(result, ProductIndexEsField.productSkn, 0); | ||
76 | - Integer brandId = MapUtils.getInteger(result, ProductIndexEsField.brandId, 0); | ||
77 | - Integer middleSortId = MapUtils.getInteger(result, ProductIndexEsField.middleSortId, 0); | ||
78 | - recallSkns.add(new RecallResponse.RecallSkn(productSkn, brandId, middleSortId)); | ||
79 | - } | ||
80 | - return new RecallResponse(searchResult.getTotal(), recallSkns); | ||
81 | - } | ||
82 | - | ||
83 | -} | 1 | +package com.yoho.search.recall.scene.cache.beans; |
2 | + | ||
3 | +import com.yoho.search.base.utils.ISearchConstants; | ||
4 | +import com.yoho.search.base.utils.ProductIndexEsField; | ||
5 | +import com.yoho.search.core.es.model.SearchParam; | ||
6 | +import com.yoho.search.core.es.model.SearchResult; | ||
7 | +import com.yoho.search.recall.scene.cache.CacheRequestResponseComponent; | ||
8 | +import com.yoho.search.recall.scene.models.RecallRequest; | ||
9 | +import com.yoho.search.recall.scene.models.RecallResponse; | ||
10 | +import com.yoho.search.service.base.SearchCommonService; | ||
11 | +import org.apache.commons.collections.MapUtils; | ||
12 | +import org.springframework.beans.factory.annotation.Autowired; | ||
13 | +import org.springframework.stereotype.Component; | ||
14 | + | ||
15 | +import java.util.ArrayList; | ||
16 | +import java.util.HashMap; | ||
17 | +import java.util.List; | ||
18 | +import java.util.Map; | ||
19 | + | ||
20 | +@Component | ||
21 | +public class CacheRecallRequestResponseBean extends CacheRequestResponseComponent<RecallRequest,RecallResponse,CacheRecallRequestResponse>{ | ||
22 | + | ||
23 | + @Autowired | ||
24 | + private SearchCommonService searchCommonService; | ||
25 | + | ||
26 | + private static final int maxEsRequestCountPerTime = 10; | ||
27 | + | ||
28 | + /** | ||
29 | + * 批量召回入口 | ||
30 | + * | ||
31 | + * @param batchRequests | ||
32 | + * @return | ||
33 | + */ | ||
34 | + public List<CacheRecallRequestResponse> batchRecallAndCache(final List<RecallRequest> batchRequests) { | ||
35 | + //1、构造请求 | ||
36 | + final List<CacheRecallRequestResponse> results = new ArrayList<>(); | ||
37 | + for (RecallRequest request : batchRequests) { | ||
38 | + results.add(new CacheRecallRequestResponse(request)); | ||
39 | + } | ||
40 | + //2、执行查询 | ||
41 | + this.bacthFillResponseWithCache(results,false); | ||
42 | + | ||
43 | + //3、返回结果 | ||
44 | + return results; | ||
45 | + } | ||
46 | + | ||
47 | + @Override | ||
48 | + public Map<RecallRequest, RecallResponse> queryMissCacheRequestResults(List<CacheRecallRequestResponse> missCacheRequests) { | ||
49 | + //1、构造请求参数 | ||
50 | + List<SearchParam> searchParams = new ArrayList<>(); | ||
51 | + for (CacheRecallRequestResponse requestResponse : missCacheRequests) { | ||
52 | + searchParams.add(requestResponse.getRequest().searchParam()); | ||
53 | + //控制每次请求es的数量 | ||
54 | + if(searchParams.size()>=maxEsRequestCountPerTime){ | ||
55 | + break; | ||
56 | + } | ||
57 | + } | ||
58 | + //2、执行搜索 | ||
59 | + List<SearchResult> searchResults = searchCommonService.doMutiSearch(ISearchConstants.INDEX_NAME_PRODUCT_INDEX, searchParams); | ||
60 | + //3、构造返回结果 | ||
61 | + Map<RecallRequest,RecallResponse> notCachedResults = new HashMap<>(); | ||
62 | + for (int i = 0; i < missCacheRequests.size(); i++) { | ||
63 | + RecallRequest request = missCacheRequests.get(i).getRequest(); | ||
64 | + SearchResult searchResult = searchResults.get(i); | ||
65 | + RecallResponse response = this.buildResonse(searchResult); | ||
66 | + notCachedResults.put(request,response); | ||
67 | + } | ||
68 | + return notCachedResults; | ||
69 | + } | ||
70 | + | ||
71 | + private RecallResponse buildResonse(SearchResult searchResult) { | ||
72 | + List<Map<String, Object>> results = searchResult.getResultList(); | ||
73 | + List<RecallResponse.RecallSkn> recallSkns = new ArrayList<>(); | ||
74 | + for (Map<String, Object> result : results) { | ||
75 | + Integer productSkn = MapUtils.getInteger(result, ProductIndexEsField.productSkn, 0); | ||
76 | + Integer brandId = MapUtils.getInteger(result, ProductIndexEsField.brandId, 0); | ||
77 | + Integer middleSortId = MapUtils.getInteger(result, ProductIndexEsField.middleSortId, 0); | ||
78 | + recallSkns.add(new RecallResponse.RecallSkn(productSkn, brandId, middleSortId)); | ||
79 | + } | ||
80 | + return new RecallResponse(searchResult.getTotal(), recallSkns); | ||
81 | + } | ||
82 | + | ||
83 | +} |
1 | -package com.yoho.search.recall.scene.cache.beans; | ||
2 | - | ||
3 | -import com.alibaba.fastjson.JSON; | ||
4 | -import com.yoho.search.base.utils.Transfer; | ||
5 | -import com.yoho.search.recall.scene.cache.CacheRequestResponse; | ||
6 | -import com.yoho.search.recall.scene.models.RecallSknParams; | ||
7 | -import com.yoho.search.recall.scene.models.RecallSknResult; | ||
8 | - | ||
9 | -public class CacheRecallSknRequestResponse extends CacheRequestResponse<RecallSknParams,RecallSknResult> { | ||
10 | - | ||
11 | - public CacheRecallSknRequestResponse(RecallSknParams request) { | ||
12 | - super(request); | ||
13 | - } | ||
14 | - | ||
15 | - private static Transfer<String,RecallSknResult> toResponseTransfer = new Transfer<String, RecallSknResult>() { | ||
16 | - @Override | ||
17 | - public RecallSknResult transfer(String jsonValue) { | ||
18 | - return JSON.parseObject(jsonValue, RecallSknResult.class); | ||
19 | - } | ||
20 | - }; | ||
21 | - | ||
22 | - private static Transfer<RecallSknResult,String> fromResponseTransfer = new Transfer<RecallSknResult, String>() { | ||
23 | - @Override | ||
24 | - public String transfer(RecallSknResult recallSknResult) { | ||
25 | - return JSON.toJSONString(recallSknResult); | ||
26 | - } | ||
27 | - }; | ||
28 | - | ||
29 | - @Override | ||
30 | - public Transfer<String, RecallSknResult> getToResponseTransfer() { | ||
31 | - return toResponseTransfer; | ||
32 | - } | ||
33 | - | ||
34 | - @Override | ||
35 | - public Transfer<RecallSknResult, String> getFromResponseTransfer() { | ||
36 | - return fromResponseTransfer; | ||
37 | - } | ||
38 | -} | 1 | +package com.yoho.search.recall.scene.cache.beans; |
2 | + | ||
3 | +import com.alibaba.fastjson.JSON; | ||
4 | +import com.yoho.search.base.utils.Transfer; | ||
5 | +import com.yoho.search.recall.scene.cache.CacheRequestResponse; | ||
6 | +import com.yoho.search.recall.scene.models.RecallSknParams; | ||
7 | +import com.yoho.search.recall.scene.models.RecallSknResult; | ||
8 | + | ||
9 | +public class CacheRecallSknRequestResponse extends CacheRequestResponse<RecallSknParams,RecallSknResult> { | ||
10 | + | ||
11 | + public CacheRecallSknRequestResponse(RecallSknParams request) { | ||
12 | + super(request); | ||
13 | + } | ||
14 | + | ||
15 | + private static Transfer<String,RecallSknResult> toResponseTransfer = new Transfer<String, RecallSknResult>() { | ||
16 | + @Override | ||
17 | + public RecallSknResult transfer(String jsonValue) { | ||
18 | + return JSON.parseObject(jsonValue, RecallSknResult.class); | ||
19 | + } | ||
20 | + }; | ||
21 | + | ||
22 | + private static Transfer<RecallSknResult,String> fromResponseTransfer = new Transfer<RecallSknResult, String>() { | ||
23 | + @Override | ||
24 | + public String transfer(RecallSknResult recallSknResult) { | ||
25 | + return JSON.toJSONString(recallSknResult); | ||
26 | + } | ||
27 | + }; | ||
28 | + | ||
29 | + @Override | ||
30 | + public Transfer<String, RecallSknResult> getToResponseTransfer() { | ||
31 | + return toResponseTransfer; | ||
32 | + } | ||
33 | + | ||
34 | + @Override | ||
35 | + public Transfer<RecallSknResult, String> getFromResponseTransfer() { | ||
36 | + return fromResponseTransfer; | ||
37 | + } | ||
38 | +} |
1 | -package com.yoho.search.recall.scene.cache.beans; | ||
2 | - | ||
3 | -import com.yoho.search.recall.scene.builder.request.BrandRecallRequestBuilder; | ||
4 | -import com.yoho.search.recall.scene.builder.request.CommonRecallRequestBuilder; | ||
5 | -import com.yoho.search.recall.scene.builder.request.SortPriceRecallRequestBuilder; | ||
6 | -import com.yoho.search.recall.scene.builder.response.RecallResponseBatchBuilder; | ||
7 | -import com.yoho.search.recall.scene.builder.response.RecallSknResultBuilder; | ||
8 | -import com.yoho.search.recall.scene.cache.CacheRequestResponseComponent; | ||
9 | -import com.yoho.search.recall.scene.models.RecallRequest; | ||
10 | -import com.yoho.search.recall.scene.models.RecallResponseBatch; | ||
11 | -import com.yoho.search.recall.scene.models.RecallSknParams; | ||
12 | -import com.yoho.search.recall.scene.models.RecallSknResult; | ||
13 | -import com.yoho.search.recall.scene.persional.PersionalFactor; | ||
14 | -import com.yoho.search.recall.scene.persional.RecallPersionalService; | ||
15 | -import org.springframework.beans.factory.annotation.Autowired; | ||
16 | -import org.springframework.stereotype.Component; | ||
17 | - | ||
18 | -import java.util.ArrayList; | ||
19 | -import java.util.HashMap; | ||
20 | -import java.util.List; | ||
21 | -import java.util.Map; | ||
22 | - | ||
23 | -@Component | ||
24 | -public class CacheRecallSknRequestResponseBean extends CacheRequestResponseComponent<RecallSknParams,RecallSknResult,CacheRecallSknRequestResponse>{ | ||
25 | - | ||
26 | - @Autowired | ||
27 | - private RecallPersionalService recallPersionalService; | ||
28 | - @Autowired | ||
29 | - private CacheRecallRequestResponseBean cacheRecallRequestResponseBean; | ||
30 | - @Autowired | ||
31 | - private RecallResponseBatchBuilder recallResponseBatchBuilder; | ||
32 | - @Autowired | ||
33 | - private RecallSknResultBuilder recallSknResultBuilder; | ||
34 | - @Autowired | ||
35 | - private CommonRecallRequestBuilder commonRequestBuilder; | ||
36 | - @Autowired | ||
37 | - private BrandRecallRequestBuilder brandRequestBuilder; | ||
38 | - @Autowired | ||
39 | - private SortPriceRecallRequestBuilder sortPriceRequestBuilder; | ||
40 | - | ||
41 | - /** | ||
42 | - * 召回入口 | ||
43 | - * @param recallSknParams | ||
44 | - * @return | ||
45 | - */ | ||
46 | - public RecallSknResult doRecallSknResult(RecallSknParams recallSknParams){ | ||
47 | - //1、构建请求 | ||
48 | - List<CacheRecallSknRequestResponse> requests = new ArrayList<>(); | ||
49 | - requests.add(new CacheRecallSknRequestResponse(recallSknParams)); | ||
50 | - | ||
51 | - //2、执行父类方法 | ||
52 | - this.bacthFillResponseWithCache(requests,false); | ||
53 | - | ||
54 | - //3、判断 | ||
55 | - if(requests.size()==1 && requests.get(0).getResponse()!=null){ | ||
56 | - return requests.get(0).getResponse(); | ||
57 | - } | ||
58 | - return null; | ||
59 | - } | ||
60 | - | ||
61 | - @Override | ||
62 | - public Map<RecallSknParams, RecallSknResult> queryMissCacheRequestResults(List<CacheRecallSknRequestResponse> missCachseRequests) { | ||
63 | - Map<RecallSknParams, RecallSknResult> results = new HashMap<>(); | ||
64 | - for (CacheRecallSknRequestResponse request: missCachseRequests) { | ||
65 | - RecallSknResult response = this.doRealRecall(request.getRequest()); | ||
66 | - results.put(request.getRequest(),response); | ||
67 | - } | ||
68 | - return results; | ||
69 | - } | ||
70 | - | ||
71 | - /** | ||
72 | - * 真正的召回入口 | ||
73 | - * @param param | ||
74 | - * @return | ||
75 | - */ | ||
76 | - private RecallSknResult doRealRecall(RecallSknParams param) { | ||
77 | - //1、获取个性化因子 | ||
78 | - PersionalFactor persionalFactor = recallPersionalService.queryPersionalFactor(param); | ||
79 | - //2、构造请求 | ||
80 | - List<RecallRequest> batchRequests = this.buildBatchRequests(param, persionalFactor); | ||
81 | - //3、批量召回 | ||
82 | - List<CacheRecallRequestResponse> requestResponses = cacheRecallRequestResponseBean.batchRecallAndCache(batchRequests); | ||
83 | - //4、获取skn列表[去重] | ||
84 | - RecallResponseBatch recallResponseBatch = recallResponseBatchBuilder.buildRecallResponseBatch(requestResponses); | ||
85 | - //5、构造真实结果[排序,截取skn] | ||
86 | - RecallSknResult recallSknResult = recallSknResultBuilder.builderRecallResult(recallResponseBatch, param, persionalFactor); | ||
87 | - return recallSknResult; | ||
88 | - } | ||
89 | - | ||
90 | - /** | ||
91 | - * 批量构造请求 | ||
92 | - * @param param | ||
93 | - * @param persionalFactor | ||
94 | - * @return | ||
95 | - */ | ||
96 | - private List<RecallRequest> buildBatchRequests(RecallSknParams param, PersionalFactor persionalFactor) { | ||
97 | - //1、构造召回请求 | ||
98 | - List<RecallRequest> allRequests = new ArrayList<>(); | ||
99 | - //2、构造非个性化的请求 | ||
100 | - List<RecallRequest> commonRequests = commonRequestBuilder.buildCommonRecallRequests(param.getParamQueryFilter(), param.getFirstProductSkns()); | ||
101 | - allRequests.addAll(commonRequests); | ||
102 | - //4、构建个性化品牌的召回请求 | ||
103 | - List<RecallRequest> brandRequests = brandRequestBuilder.buildBrandRecallRequests(param.getParamQueryFilter(), persionalFactor.getBrandIds()); | ||
104 | - allRequests.addAll(brandRequests); | ||
105 | - //5、构建个性化品牌的召回请求 | ||
106 | - List<RecallRequest> sortPriceRequests = sortPriceRequestBuilder.buildSortPriceRecallRequests(param.getParamQueryFilter(), persionalFactor.getSortPriceAreas()); | ||
107 | - allRequests.addAll(sortPriceRequests); | ||
108 | - return allRequests; | ||
109 | - } | ||
110 | - | ||
111 | - | ||
112 | -} | 1 | +package com.yoho.search.recall.scene.cache.beans; |
2 | + | ||
3 | +import com.yoho.search.recall.scene.builder.request.BrandRecallRequestBuilder; | ||
4 | +import com.yoho.search.recall.scene.builder.request.CommonRecallRequestBuilder; | ||
5 | +import com.yoho.search.recall.scene.builder.request.SortPriceRecallRequestBuilder; | ||
6 | +import com.yoho.search.recall.scene.builder.response.RecallResponseBatchBuilder; | ||
7 | +import com.yoho.search.recall.scene.builder.response.RecallSknResultBuilder; | ||
8 | +import com.yoho.search.recall.scene.cache.CacheRequestResponseComponent; | ||
9 | +import com.yoho.search.recall.scene.models.RecallRequest; | ||
10 | +import com.yoho.search.recall.scene.models.RecallResponseBatch; | ||
11 | +import com.yoho.search.recall.scene.models.RecallSknParams; | ||
12 | +import com.yoho.search.recall.scene.models.RecallSknResult; | ||
13 | +import com.yoho.search.recall.scene.persional.PersionalFactor; | ||
14 | +import com.yoho.search.recall.scene.persional.RecallPersionalService; | ||
15 | +import org.springframework.beans.factory.annotation.Autowired; | ||
16 | +import org.springframework.stereotype.Component; | ||
17 | + | ||
18 | +import java.util.ArrayList; | ||
19 | +import java.util.HashMap; | ||
20 | +import java.util.List; | ||
21 | +import java.util.Map; | ||
22 | + | ||
23 | +@Component | ||
24 | +public class CacheRecallSknRequestResponseBean extends CacheRequestResponseComponent<RecallSknParams,RecallSknResult,CacheRecallSknRequestResponse>{ | ||
25 | + | ||
26 | + @Autowired | ||
27 | + private RecallPersionalService recallPersionalService; | ||
28 | + @Autowired | ||
29 | + private CacheRecallRequestResponseBean cacheRecallRequestResponseBean; | ||
30 | + @Autowired | ||
31 | + private RecallResponseBatchBuilder recallResponseBatchBuilder; | ||
32 | + @Autowired | ||
33 | + private RecallSknResultBuilder recallSknResultBuilder; | ||
34 | + @Autowired | ||
35 | + private CommonRecallRequestBuilder commonRequestBuilder; | ||
36 | + @Autowired | ||
37 | + private BrandRecallRequestBuilder brandRequestBuilder; | ||
38 | + @Autowired | ||
39 | + private SortPriceRecallRequestBuilder sortPriceRequestBuilder; | ||
40 | + | ||
41 | + /** | ||
42 | + * 召回入口 | ||
43 | + * @param recallSknParams | ||
44 | + * @return | ||
45 | + */ | ||
46 | + public RecallSknResult doRecallSknResult(RecallSknParams recallSknParams){ | ||
47 | + //1、构建请求 | ||
48 | + List<CacheRecallSknRequestResponse> requests = new ArrayList<>(); | ||
49 | + requests.add(new CacheRecallSknRequestResponse(recallSknParams)); | ||
50 | + | ||
51 | + //2、执行父类方法 | ||
52 | + this.bacthFillResponseWithCache(requests,false); | ||
53 | + | ||
54 | + //3、判断 | ||
55 | + if(requests.size()==1 && requests.get(0).getResponse()!=null){ | ||
56 | + return requests.get(0).getResponse(); | ||
57 | + } | ||
58 | + return null; | ||
59 | + } | ||
60 | + | ||
61 | + @Override | ||
62 | + public Map<RecallSknParams, RecallSknResult> queryMissCacheRequestResults(List<CacheRecallSknRequestResponse> missCachseRequests) { | ||
63 | + Map<RecallSknParams, RecallSknResult> results = new HashMap<>(); | ||
64 | + for (CacheRecallSknRequestResponse request: missCachseRequests) { | ||
65 | + RecallSknResult response = this.doRealRecall(request.getRequest()); | ||
66 | + results.put(request.getRequest(),response); | ||
67 | + } | ||
68 | + return results; | ||
69 | + } | ||
70 | + | ||
71 | + /** | ||
72 | + * 真正的召回入口 | ||
73 | + * @param param | ||
74 | + * @return | ||
75 | + */ | ||
76 | + private RecallSknResult doRealRecall(RecallSknParams param) { | ||
77 | + //1、获取个性化因子 | ||
78 | + PersionalFactor persionalFactor = recallPersionalService.queryPersionalFactor(param); | ||
79 | + //2、构造请求 | ||
80 | + List<RecallRequest> batchRequests = this.buildBatchRequests(param, persionalFactor); | ||
81 | + //3、批量召回 | ||
82 | + List<CacheRecallRequestResponse> requestResponses = cacheRecallRequestResponseBean.batchRecallAndCache(batchRequests); | ||
83 | + //4、获取skn列表[去重] | ||
84 | + RecallResponseBatch recallResponseBatch = recallResponseBatchBuilder.buildRecallResponseBatch(requestResponses); | ||
85 | + //5、构造真实结果[排序,截取skn] | ||
86 | + RecallSknResult recallSknResult = recallSknResultBuilder.builderRecallResult(recallResponseBatch, param, persionalFactor); | ||
87 | + return recallSknResult; | ||
88 | + } | ||
89 | + | ||
90 | + /** | ||
91 | + * 批量构造请求 | ||
92 | + * @param param | ||
93 | + * @param persionalFactor | ||
94 | + * @return | ||
95 | + */ | ||
96 | + private List<RecallRequest> buildBatchRequests(RecallSknParams param, PersionalFactor persionalFactor) { | ||
97 | + //1、构造召回请求 | ||
98 | + List<RecallRequest> allRequests = new ArrayList<>(); | ||
99 | + //2、构造非个性化的请求 | ||
100 | + List<RecallRequest> commonRequests = commonRequestBuilder.buildCommonRecallRequests(param.getParamQueryFilter(), param.getFirstProductSkns()); | ||
101 | + allRequests.addAll(commonRequests); | ||
102 | + //4、构建个性化品牌的召回请求 | ||
103 | + List<RecallRequest> brandRequests = brandRequestBuilder.buildBrandRecallRequests(param.getParamQueryFilter(), persionalFactor.getBrandIds()); | ||
104 | + allRequests.addAll(brandRequests); | ||
105 | + //5、构建个性化品牌的召回请求 | ||
106 | + List<RecallRequest> sortPriceRequests = sortPriceRequestBuilder.buildSortPriceRecallRequests(param.getParamQueryFilter(), persionalFactor.getSortPriceAreas()); | ||
107 | + allRequests.addAll(sortPriceRequests); | ||
108 | + return allRequests; | ||
109 | + } | ||
110 | + | ||
111 | + | ||
112 | +} |
1 | -package com.yoho.search.recall.scene.cache.beans; | ||
2 | - | ||
3 | -import com.alibaba.fastjson.JSON; | ||
4 | -import com.alibaba.fastjson.JSONObject; | ||
5 | -import com.yoho.core.redis.cluster.operations.serializer.RedisKeyBuilder; | ||
6 | -import com.yoho.search.base.utils.Transfer; | ||
7 | -import com.yoho.search.recall.scene.cache.CacheRequestResponse; | ||
8 | -import com.yoho.search.recall.scene.models.SknInfoRequest; | ||
9 | - | ||
10 | -import java.util.HashMap; | ||
11 | -import java.util.Map; | ||
12 | - | ||
13 | -public class CacheSknInfoRequestResponse extends CacheRequestResponse<SknInfoRequest, Map<String, Object>> { | ||
14 | - | ||
15 | - public CacheSknInfoRequestResponse(SknInfoRequest sknInfoRequest) { | ||
16 | - super(sknInfoRequest); | ||
17 | - } | ||
18 | - | ||
19 | - static Transfer<String, Map<String, Object>> toResponseTransfer = new Transfer<String, Map<String, Object>>() { | ||
20 | - @Override | ||
21 | - public Map<String, Object> transfer(String value) { | ||
22 | - Map<String, Object> product = new HashMap<>(); | ||
23 | - product.putAll(JSONObject.parseObject(value)); | ||
24 | - return product; | ||
25 | - } | ||
26 | - }; | ||
27 | - | ||
28 | - static Transfer<Map<String, Object>, String> fromResponseTransfer = new Transfer<Map<String, Object>, String>() { | ||
29 | - @Override | ||
30 | - public String transfer(Map<String, Object> product) { | ||
31 | - return JSON.toJSONString(product); | ||
32 | - } | ||
33 | - }; | ||
34 | - | ||
35 | - @Override | ||
36 | - public Transfer<String, Map<String, Object>> getToResponseTransfer() { | ||
37 | - return toResponseTransfer; | ||
38 | - } | ||
39 | - | ||
40 | - @Override | ||
41 | - public Transfer<Map<String, Object>, String> getFromResponseTransfer() { | ||
42 | - return fromResponseTransfer; | ||
43 | - } | ||
44 | -} | 1 | +package com.yoho.search.recall.scene.cache.beans; |
2 | + | ||
3 | +import com.alibaba.fastjson.JSON; | ||
4 | +import com.alibaba.fastjson.JSONObject; | ||
5 | +import com.yoho.core.redis.cluster.operations.serializer.RedisKeyBuilder; | ||
6 | +import com.yoho.search.base.utils.Transfer; | ||
7 | +import com.yoho.search.recall.scene.cache.CacheRequestResponse; | ||
8 | +import com.yoho.search.recall.scene.models.SknInfoRequest; | ||
9 | + | ||
10 | +import java.util.HashMap; | ||
11 | +import java.util.Map; | ||
12 | + | ||
13 | +public class CacheSknInfoRequestResponse extends CacheRequestResponse<SknInfoRequest, Map<String, Object>> { | ||
14 | + | ||
15 | + public CacheSknInfoRequestResponse(SknInfoRequest sknInfoRequest) { | ||
16 | + super(sknInfoRequest); | ||
17 | + } | ||
18 | + | ||
19 | + static Transfer<String, Map<String, Object>> toResponseTransfer = new Transfer<String, Map<String, Object>>() { | ||
20 | + @Override | ||
21 | + public Map<String, Object> transfer(String value) { | ||
22 | + Map<String, Object> product = new HashMap<>(); | ||
23 | + product.putAll(JSONObject.parseObject(value)); | ||
24 | + return product; | ||
25 | + } | ||
26 | + }; | ||
27 | + | ||
28 | + static Transfer<Map<String, Object>, String> fromResponseTransfer = new Transfer<Map<String, Object>, String>() { | ||
29 | + @Override | ||
30 | + public String transfer(Map<String, Object> product) { | ||
31 | + return JSON.toJSONString(product); | ||
32 | + } | ||
33 | + }; | ||
34 | + | ||
35 | + @Override | ||
36 | + public Transfer<String, Map<String, Object>> getToResponseTransfer() { | ||
37 | + return toResponseTransfer; | ||
38 | + } | ||
39 | + | ||
40 | + @Override | ||
41 | + public Transfer<Map<String, Object>, String> getFromResponseTransfer() { | ||
42 | + return fromResponseTransfer; | ||
43 | + } | ||
44 | +} |
1 | -package com.yoho.search.recall.scene.cache.beans; | ||
2 | - | ||
3 | - | ||
4 | -import com.yoho.search.base.utils.ISearchConstants; | ||
5 | -import com.yoho.search.base.utils.ProductIndexEsField; | ||
6 | -import com.yoho.search.core.es.model.SearchParam; | ||
7 | -import com.yoho.search.core.es.model.SearchResult; | ||
8 | -import com.yoho.search.recall.scene.cache.CacheRequestResponseComponent; | ||
9 | -import com.yoho.search.recall.scene.models.SknInfoRequest; | ||
10 | -import com.yoho.search.service.base.SearchCommonService; | ||
11 | -import com.yoho.search.service.base.index.ProductIndexBaseService; | ||
12 | -import org.apache.commons.collections.MapUtils; | ||
13 | -import org.elasticsearch.index.query.QueryBuilders; | ||
14 | -import org.springframework.beans.factory.annotation.Autowired; | ||
15 | -import org.springframework.stereotype.Component; | ||
16 | - | ||
17 | -import java.util.ArrayList; | ||
18 | -import java.util.HashMap; | ||
19 | -import java.util.List; | ||
20 | -import java.util.Map; | ||
21 | - | ||
22 | -@Component | ||
23 | -public class CacheSknInfoRequestResponseBean extends CacheRequestResponseComponent<SknInfoRequest,Map<String, Object>,CacheSknInfoRequestResponse>{ | ||
24 | - | ||
25 | - @Autowired | ||
26 | - private SearchCommonService searchCommonService; | ||
27 | - @Autowired | ||
28 | - private ProductIndexBaseService productIndexBaseService; | ||
29 | - | ||
30 | - /** | ||
31 | - * 按skn查询并按顺序返回 | ||
32 | - * | ||
33 | - * @param productSkns | ||
34 | - * @return | ||
35 | - */ | ||
36 | - public List<Map<String, Object>> queryProductListBySkn(List<Integer> productSkns,int size){ | ||
37 | - //1、批量查询SKN信息 | ||
38 | - List<CacheSknInfoRequestResponse> sknInfoCacheRequestRespons = this.batchQuery(productSkns); | ||
39 | - //2、构造返回结果 | ||
40 | - List<Map<String, Object>> finalResults = new ArrayList<>(); | ||
41 | - for (CacheSknInfoRequestResponse sknInfoCacheRequestResponse : sknInfoCacheRequestRespons) { | ||
42 | - if(sknInfoCacheRequestResponse !=null && sknInfoCacheRequestResponse.getResponse()!=null){ | ||
43 | - finalResults.add(sknInfoCacheRequestResponse.getResponse()); | ||
44 | - } | ||
45 | - if(finalResults.size()>=size){ | ||
46 | - break; | ||
47 | - } | ||
48 | - } | ||
49 | - return finalResults; | ||
50 | - } | ||
51 | - | ||
52 | - private List<CacheSknInfoRequestResponse> batchQuery(List<Integer> productSkns){ | ||
53 | - //1、构建请求与返回结果 | ||
54 | - final List<CacheSknInfoRequestResponse> requests = new ArrayList<>(); | ||
55 | - for (Integer productSkn : productSkns) { | ||
56 | - requests.add(new CacheSknInfoRequestResponse(new SknInfoRequest(productSkn))); | ||
57 | - } | ||
58 | - //2、调父类方法 | ||
59 | - this.bacthFillResponseWithCache(requests,true); | ||
60 | - | ||
61 | - //3、返回结果 | ||
62 | - return requests; | ||
63 | - } | ||
64 | - | ||
65 | - @Override | ||
66 | - public Map<SknInfoRequest, Map<String, Object>> queryMissCacheRequestResults(List<CacheSknInfoRequestResponse> missCacheRequests) { | ||
67 | - //1、合法性判断 | ||
68 | - Map<SknInfoRequest,Map<String, Object>> results = new HashMap<>(); | ||
69 | - if(missCacheRequests==null||missCacheRequests.isEmpty()){ | ||
70 | - return results; | ||
71 | - } | ||
72 | - //2、获取skn | ||
73 | - List<Integer> productSkns = new ArrayList<>(); | ||
74 | - for (CacheSknInfoRequestResponse sknInfoCacheRequestResponse : missCacheRequests) { | ||
75 | - productSkns.add(sknInfoCacheRequestResponse.getRequest().getProductSkn()); | ||
76 | - } | ||
77 | - //3、构建SearchParam | ||
78 | - SearchParam searchParam = new SearchParam(); | ||
79 | - searchParam.setOffset(0); | ||
80 | - searchParam.setSize(productSkns.size()); | ||
81 | - searchParam.setFiter(QueryBuilders.termsQuery(ProductIndexEsField.productSkn, productSkns)); | ||
82 | - searchParam.setIncludeFields(productIndexBaseService.getProductIndexIncludeFields()); | ||
83 | - SearchResult searchResult = searchCommonService.doSearch(ISearchConstants.INDEX_NAME_PRODUCT_INDEX, searchParam); | ||
84 | - List<Map<String, Object>> productList = productIndexBaseService.getProductListWithPricePlan(searchResult.getResultList()); | ||
85 | - //4、构建SKN临时结果 | ||
86 | - Map<Integer,Map<String, Object>> productTempMap = new HashMap<>(); | ||
87 | - for (Map<String, Object> product: productList) { | ||
88 | - productTempMap.put(MapUtils.getIntValue(product,"product_skn",0),product); | ||
89 | - } | ||
90 | - //5、构造最终结果 | ||
91 | - for (CacheSknInfoRequestResponse requestResponse :missCacheRequests ) { | ||
92 | - results.put(requestResponse.getRequest(),productTempMap.get(requestResponse.getRequest().getProductSkn())); | ||
93 | - } | ||
94 | - return results; | ||
95 | - } | ||
96 | - | ||
97 | - | ||
98 | - | ||
99 | - | ||
100 | - | ||
101 | - | ||
102 | -} | 1 | +package com.yoho.search.recall.scene.cache.beans; |
2 | + | ||
3 | + | ||
4 | +import com.yoho.search.base.utils.ISearchConstants; | ||
5 | +import com.yoho.search.base.utils.ProductIndexEsField; | ||
6 | +import com.yoho.search.core.es.model.SearchParam; | ||
7 | +import com.yoho.search.core.es.model.SearchResult; | ||
8 | +import com.yoho.search.recall.scene.cache.CacheRequestResponseComponent; | ||
9 | +import com.yoho.search.recall.scene.models.SknInfoRequest; | ||
10 | +import com.yoho.search.service.base.SearchCommonService; | ||
11 | +import com.yoho.search.service.base.index.ProductIndexBaseService; | ||
12 | +import org.apache.commons.collections.MapUtils; | ||
13 | +import org.elasticsearch.index.query.QueryBuilders; | ||
14 | +import org.springframework.beans.factory.annotation.Autowired; | ||
15 | +import org.springframework.stereotype.Component; | ||
16 | + | ||
17 | +import java.util.ArrayList; | ||
18 | +import java.util.HashMap; | ||
19 | +import java.util.List; | ||
20 | +import java.util.Map; | ||
21 | + | ||
22 | +@Component | ||
23 | +public class CacheSknInfoRequestResponseBean extends CacheRequestResponseComponent<SknInfoRequest,Map<String, Object>,CacheSknInfoRequestResponse>{ | ||
24 | + | ||
25 | + @Autowired | ||
26 | + private SearchCommonService searchCommonService; | ||
27 | + @Autowired | ||
28 | + private ProductIndexBaseService productIndexBaseService; | ||
29 | + | ||
30 | + /** | ||
31 | + * 按skn查询并按顺序返回 | ||
32 | + * | ||
33 | + * @param productSkns | ||
34 | + * @return | ||
35 | + */ | ||
36 | + public List<Map<String, Object>> queryProductListBySkn(List<Integer> productSkns,int size){ | ||
37 | + //1、批量查询SKN信息 | ||
38 | + List<CacheSknInfoRequestResponse> sknInfoCacheRequestRespons = this.batchQuery(productSkns); | ||
39 | + //2、构造返回结果 | ||
40 | + List<Map<String, Object>> finalResults = new ArrayList<>(); | ||
41 | + for (CacheSknInfoRequestResponse sknInfoCacheRequestResponse : sknInfoCacheRequestRespons) { | ||
42 | + if(sknInfoCacheRequestResponse !=null && sknInfoCacheRequestResponse.getResponse()!=null){ | ||
43 | + finalResults.add(sknInfoCacheRequestResponse.getResponse()); | ||
44 | + } | ||
45 | + if(finalResults.size()>=size){ | ||
46 | + break; | ||
47 | + } | ||
48 | + } | ||
49 | + return finalResults; | ||
50 | + } | ||
51 | + | ||
52 | + private List<CacheSknInfoRequestResponse> batchQuery(List<Integer> productSkns){ | ||
53 | + //1、构建请求与返回结果 | ||
54 | + final List<CacheSknInfoRequestResponse> requests = new ArrayList<>(); | ||
55 | + for (Integer productSkn : productSkns) { | ||
56 | + requests.add(new CacheSknInfoRequestResponse(new SknInfoRequest(productSkn))); | ||
57 | + } | ||
58 | + //2、调父类方法 | ||
59 | + this.bacthFillResponseWithCache(requests,true); | ||
60 | + | ||
61 | + //3、返回结果 | ||
62 | + return requests; | ||
63 | + } | ||
64 | + | ||
65 | + @Override | ||
66 | + public Map<SknInfoRequest, Map<String, Object>> queryMissCacheRequestResults(List<CacheSknInfoRequestResponse> missCacheRequests) { | ||
67 | + //1、合法性判断 | ||
68 | + Map<SknInfoRequest,Map<String, Object>> results = new HashMap<>(); | ||
69 | + if(missCacheRequests==null||missCacheRequests.isEmpty()){ | ||
70 | + return results; | ||
71 | + } | ||
72 | + //2、获取skn | ||
73 | + List<Integer> productSkns = new ArrayList<>(); | ||
74 | + for (CacheSknInfoRequestResponse sknInfoCacheRequestResponse : missCacheRequests) { | ||
75 | + productSkns.add(sknInfoCacheRequestResponse.getRequest().getProductSkn()); | ||
76 | + } | ||
77 | + //3、构建SearchParam | ||
78 | + SearchParam searchParam = new SearchParam(); | ||
79 | + searchParam.setOffset(0); | ||
80 | + searchParam.setSize(productSkns.size()); | ||
81 | + searchParam.setFiter(QueryBuilders.termsQuery(ProductIndexEsField.productSkn, productSkns)); | ||
82 | + searchParam.setIncludeFields(productIndexBaseService.getProductIndexIncludeFields()); | ||
83 | + SearchResult searchResult = searchCommonService.doSearch(ISearchConstants.INDEX_NAME_PRODUCT_INDEX, searchParam); | ||
84 | + List<Map<String, Object>> productList = productIndexBaseService.getProductListWithPricePlan(searchResult.getResultList()); | ||
85 | + //4、构建SKN临时结果 | ||
86 | + Map<Integer,Map<String, Object>> productTempMap = new HashMap<>(); | ||
87 | + for (Map<String, Object> product: productList) { | ||
88 | + productTempMap.put(MapUtils.getIntValue(product,"product_skn",0),product); | ||
89 | + } | ||
90 | + //5、构造最终结果 | ||
91 | + for (CacheSknInfoRequestResponse requestResponse :missCacheRequests ) { | ||
92 | + results.put(requestResponse.getRequest(),productTempMap.get(requestResponse.getRequest().getProductSkn())); | ||
93 | + } | ||
94 | + return results; | ||
95 | + } | ||
96 | + | ||
97 | + | ||
98 | + | ||
99 | + | ||
100 | + | ||
101 | + | ||
102 | +} |
-
Please register or login to post a comment