SceneRecallService.java
3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.yoho.search.recall.scene;
import com.alibaba.fastjson.JSONObject;
import com.yoho.search.models.SearchApiResult;
import com.yoho.search.recall.scene.component.*;
import com.yoho.search.recall.scene.models.*;
import com.yoho.search.recall.scene.persional.PersionalFactor;
import com.yoho.search.recall.scene.persional.RecallPersionalService;
import org.apache.commons.collections.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
public class SceneRecallService {
private static final Logger logger = LoggerFactory.getLogger(SceneRecallService.class);
@Autowired
private RecallParamsBuilder recallParamsBuilder;
@Autowired
private RecallPersionalService recallPersionalService;
@Autowired
private BatchRequestsBuilder batchRequestsBuilder;
@Autowired
private BatchRecallComponent bacthRecallComponent;
@Autowired
private BatchResponseBuilder batchResponseBuilder;
@Autowired
private RecallResultBuilder recallResultBuilder;
public SearchApiResult sceneRecall(Map<String, String> paramMap) {
try {
//1、分页参数验证
int page = MapUtils.getIntValue(paramMap, "page", 10);
int pageSize = MapUtils.getIntValue(paramMap, "viewNum", 10);
if (page < 1 || pageSize < 0 || page * pageSize > 1000000) {
return new SearchApiResult().setCode(400).setMessage("分页参数不合法");
}
//2、构造召回相关参数
RecallParams recallParams = recallParamsBuilder.buildRecallParams(paramMap);
//3、获取个性化因子
PersionalFactor persionalFactor = recallPersionalService.queryPersionalFactor(recallParams);
//4、执行召回
RecallResult recallResult = this.doRecall(recallParams, persionalFactor);
//TODO
//5、构造返回结果
JSONObject dataMap = new JSONObject();
dataMap.put("total", recallResult.getTotal());
dataMap.put("page", recallResult.getPage());
dataMap.put("page_size", recallResult.getPageSize());
dataMap.put("page_total", recallResult.getPageTotal());
dataMap.put("product_list", recallResult.getSknList());
return new SearchApiResult().setData(dataMap);
} catch (Exception e) {
logger.error(e.getMessage(), e);
return new SearchApiResult().setData(null).setCode(500).setMessage("Exception");
}
}
private RecallResult doRecall(RecallParams param, PersionalFactor persionalFactor) {
//1、构造请求
List<RecallRequest> batchRequests = batchRequestsBuilder.buildBatchRequests(param, persionalFactor);
//2、批量召回
List<RecallRequestResponse> requestResponses = bacthRecallComponent.batchRecallAndCache(batchRequests);
//3、获取skn列表[去重]
RecallResponseBatch recallResponseBatch = batchResponseBuilder.buildRecallResponseBatch(requestResponses);
//4、构造真实结果[排序,截取skn]
RecallResult recallResult = recallResultBuilder.builderRecallResult(recallResponseBatch, param, persionalFactor);
return recallResult;
}
}