SceneRecallService.java 3.41 KB
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;
    }

}