Authored by hugufei

拆包

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