Prechádzať zdrojové kódy

Merge branch 'feature_20240813_zhaohaipeng_xgboost' into pre-master

zhaohaipeng 9 mesiacov pred
rodič
commit
363806c732
33 zmenil súbory, kde vykonal 1203 pridanie a 118 odobranie
  1. 3 1
      .gitignore
  2. 39 0
      ad-engine-commons/pom.xml
  3. 23 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/config/SparkConfig.java
  4. 1 1
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/AbstractScorer.java
  5. 20 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/BaseXGBoostModelScorer.java
  6. 8 3
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScorerUtils.java
  7. 6 1
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/model/Model.java
  8. 2 2
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/model/ModelManager.java
  9. 586 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/model/XGBoostModel.java
  10. 123 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/CompressUtil.java
  11. 16 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/DateUtils.java
  12. 12 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/ObjUtil.java
  13. 22 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/PropertiesUtil.java
  14. 6 0
      ad-engine-server/pom.xml
  15. 17 8
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/AdRecommendController.java
  16. 9 0
      ad-engine-server/src/main/resources/20240718_ad_bucket_688.txt
  17. 2 2
      ad-engine-server/src/main/resources/ad_score_config_20240626.conf
  18. 8 0
      ad-engine-server/src/main/resources/ad_score_config_20240813.conf
  19. 8 0
      ad-engine-server/src/main/resources/ad_score_config_xgboost.conf
  20. 3 3
      ad-engine-server/src/main/resources/application-dev.yml
  21. 6 1
      ad-engine-server/src/main/resources/application.yml
  22. 8 8
      ad-engine-server/src/main/resources/logback.xml
  23. 1 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/feature/Feature.java
  24. 3 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/feature/FeatureService.java
  25. 8 15
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/log/impl/LogHubServiceImpl.java
  26. 9 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/RandomPredictModel.java
  27. 54 33
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/RankService680.java
  28. 156 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/XGBoostScorer.java
  29. 14 14
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/container/PidLambdaContainer.java
  30. 14 14
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/container/PidLambdaV2Container.java
  31. 2 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/dto/AdPlatformCreativeDTO.java
  32. 3 10
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/RankServiceImpl.java
  33. 11 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/TacticsAndLRModelScoreRankService.java

+ 3 - 1
.gitignore

@@ -35,4 +35,6 @@ apollo-cache-dir
 sentinel
 weblog
 logs
-LOG_PATH_IS_UNDEFINED
+LOG_PATH_IS_UNDEFINED
+
+xgboost

+ 39 - 0
ad-engine-commons/pom.xml

@@ -89,6 +89,45 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.scala-lang</groupId>
+            <artifactId>scala-library</artifactId>
+            <version>2.12.15</version>
+        </dependency>
+        <dependency>
+            <groupId>ml.dmlc</groupId>
+            <artifactId>xgboost4j-spark_2.12</artifactId>
+            <version>1.7.6</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>scala-library</artifactId>
+                    <groupId>org.scala-lang</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.spark</groupId>
+            <artifactId>spark-mllib_2.12</artifactId>
+            <version>3.3.1</version>
+<!--            <exclusions>-->
+<!--                <exclusion>-->
+<!--                    <artifactId>scala-library</artifactId>-->
+<!--                    <groupId>org.scala-lang</groupId>-->
+<!--                </exclusion>-->
+<!--                <exclusion>-->
+<!--                    <artifactId>hadoop-mapreduce-client-core</artifactId>-->
+<!--                    <groupId>org.apache.hadoop</groupId>-->
+<!--                </exclusion>-->
+<!--                <exclusion>-->
+<!--                    <artifactId>commons-compiler</artifactId>-->
+<!--                    <groupId>org.codehaus.janino</groupId>-->
+<!--                </exclusion>-->
+<!--                <exclusion>-->
+<!--                    <artifactId>janino</artifactId>-->
+<!--                    <groupId>org.codehaus.janino</groupId>-->
+<!--                </exclusion>-->
+<!--            </exclusions>-->
+        </dependency>
     </dependencies>
 
 </project>

+ 23 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/config/SparkConfig.java

@@ -0,0 +1,23 @@
+package com.tzld.piaoquan.ad.engine.commons.config;
+
+import org.apache.spark.SparkConf;
+import org.apache.spark.api.java.JavaSparkContext;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.Properties;
+
+@Component
+public class SparkConfig {
+
+    @PostConstruct
+    public void init() {
+        SparkConf sparkConf = new SparkConf()
+                .setMaster("local")
+                .setAppName("XGBoostPredict");
+        JavaSparkContext jsc = new JavaSparkContext(sparkConf);
+    }
+
+}

+ 1 - 1
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/AbstractScorer.java

@@ -2,8 +2,8 @@ package com.tzld.piaoquan.ad.engine.commons.score;
 
 
 import com.tzld.piaoquan.ad.engine.commons.score.model.Model;
-import com.tzld.piaoquan.ad.engine.commons.score.model.ModelManager;
 
+import com.tzld.piaoquan.ad.engine.commons.score.model.ModelManager;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.UserAdFeature;
 import org.apache.commons.lang3.StringUtils;

+ 20 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/BaseXGBoostModelScorer.java

@@ -0,0 +1,20 @@
+package com.tzld.piaoquan.ad.engine.commons.score;
+
+import com.tzld.piaoquan.ad.engine.commons.score.model.XGBoostModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public abstract class BaseXGBoostModelScorer extends AbstractScorer {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(BaseXGBoostModelScorer.class);
+
+    public BaseXGBoostModelScorer(ScorerConfigInfo scorerConfigInfo) {
+        super(scorerConfigInfo);
+    }
+
+    @Override
+    public void loadModel() {
+        doLoadModel(XGBoostModel.class);
+    }
+}

+ 8 - 3
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScorerUtils.java

@@ -30,17 +30,22 @@ public final class ScorerUtils {
     public static String VIDEO_CREATIVE_THOMPSON = "video_ad_thompson.conf";
 
     public static String LR_ROV_SCORE_20240626 = "ad_score_config_20240626.conf";
+    public static String LR_ROV_SCORE_20240813 = "ad_score_config_20240813.conf";
 
+    public static String  XGBOOST_SCORE_CONF = "ad_score_config_xgboost.conf";
     public static void warmUp() {
         log.info("scorer warm up ");
-        ScorerUtils.init(BASE_CONF);
-        ScorerUtils.init(THOMPSON_CONF);
+        // ScorerUtils.init(BASE_CONF);
+        // ScorerUtils.init(THOMPSON_CONF);
         // ScorerUtils.init(BREAK_CONFIG);
         // ScorerUtils.init(SHARE0_CONFIG);
-        ScorerUtils.init(CVR_ADJUSTING);
+        // ScorerUtils.init(CVR_ADJUSTING);
         // ScorerUtils.init(VIDEO_CREATIVE_THOMPSON);
 
         ScorerUtils.init(LR_ROV_SCORE_20240626);
+        ScorerUtils.init(LR_ROV_SCORE_20240813);
+
+        ScorerUtils.init(XGBOOST_SCORE_CONF);
     }
 
     private ScorerUtils() {

+ 6 - 1
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/model/Model.java

@@ -1,11 +1,16 @@
 package com.tzld.piaoquan.ad.engine.commons.score.model;
 
 
+import java.io.InputStream;
 import java.io.InputStreamReader;
 
-abstract public class Model {
+public abstract class Model {
     public abstract int getModelSize();
 
     public abstract boolean loadFromStream(InputStreamReader in) throws Exception;
+
+    public boolean loadFromStream(InputStream is) throws Exception {
+        return loadFromStream(new InputStreamReader(is));
+    }
 }
 

+ 2 - 2
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/model/ModelManager.java

@@ -192,10 +192,10 @@ public class ModelManager {
             ossObj = client.getObject(bucketName, loadTask.path);
             long timeStamp = ossObj.getObjectMetadata().getLastModified().getTime();
             if (loadTask.lastModifyTime <= timeStamp || isForceLoads) {
-                log.info("model file changed, ready to update, last modify: [{}]", loadTask.lastModifyTime);
+                log.info("model file [{}] changed, ready to update, last modify: [{}]", loadTask.path, loadTask.lastModifyTime);
 
                 Model model = loadTask.modelClass.newInstance();
-                if (model.loadFromStream(new InputStreamReader(ossObj.getObjectContent()))) {
+                if (model.loadFromStream(ossObj.getObjectContent())) {
                     loadTask.model = model;
                     loadTask.lastModifyTime = timeStamp;
                 }

+ 586 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/model/XGBoostModel.java

@@ -0,0 +1,586 @@
+package com.tzld.piaoquan.ad.engine.commons.score.model;
+
+
+import com.tzld.piaoquan.ad.engine.commons.util.CompressUtil;
+import com.tzld.piaoquan.ad.engine.commons.util.PropertiesUtil;
+import ml.dmlc.xgboost4j.scala.DMatrix;
+import ml.dmlc.xgboost4j.scala.spark.XGBoostClassificationModel;
+import org.apache.commons.lang.math.NumberUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.file.Paths;
+import java.util.Map;
+
+
+public class XGBoostModel extends Model {
+    private static final Logger LOGGER = LoggerFactory.getLogger(XGBoostModel.class);
+    private XGBoostClassificationModel model;
+
+    private String[] features = {
+            "cpa",
+            "b2_1h_ctr",
+            "b2_1h_ctcvr",
+            "b2_1h_cvr",
+            "b2_1h_conver",
+            "b2_1h_click",
+            "b2_1h_conver*log(view)",
+            "b2_1h_conver*ctcvr",
+            "b2_2h_ctr",
+            "b2_2h_ctcvr",
+            "b2_2h_cvr",
+            "b2_2h_conver",
+            "b2_2h_click",
+            "b2_2h_conver*log(view)",
+            "b2_2h_conver*ctcvr",
+            "b2_3h_ctr",
+            "b2_3h_ctcvr",
+            "b2_3h_cvr",
+            "b2_3h_conver",
+            "b2_3h_click",
+            "b2_3h_conver*log(view)",
+            "b2_3h_conver*ctcvr",
+            "b2_6h_ctr",
+            "b2_6h_ctcvr",
+            "b2_6h_cvr",
+            "b2_6h_conver",
+            "b2_6h_click",
+            "b2_6h_conver*log(view)",
+            "b2_6h_conver*ctcvr",
+            "b2_12h_ctr",
+            "b2_12h_ctcvr",
+            "b2_12h_cvr",
+            "b2_12h_conver",
+            "b2_12h_click",
+            "b2_12h_conver*log(view)",
+            "b2_12h_conver*ctcvr",
+            "b2_1d_ctr",
+            "b2_1d_ctcvr",
+            "b2_1d_cvr",
+            "b2_1d_conver",
+            "b2_1d_click",
+            "b2_1d_conver*log(view)",
+            "b2_1d_conver*ctcvr",
+            "b2_3d_ctr",
+            "b2_3d_ctcvr",
+            "b2_3d_cvr",
+            "b2_3d_conver",
+            "b2_3d_click",
+            "b2_3d_conver*log(view)",
+            "b2_3d_conver*ctcvr",
+            "b2_7d_ctr",
+            "b2_7d_ctcvr",
+            "b2_7d_cvr",
+            "b2_7d_conver",
+            "b2_7d_click",
+            "b2_7d_conver*log(view)",
+            "b2_7d_conver*ctcvr",
+            "b2_yesterday_ctr",
+            "b2_yesterday_ctcvr",
+            "b2_yesterday_cvr",
+            "b2_yesterday_conver",
+            "b2_yesterday_click",
+            "b2_yesterday_conver*log(view)",
+            "b2_yesterday_conver*ctcvr",
+            "b2_today_ctr",
+            "b2_today_ctcvr",
+            "b2_today_cvr",
+            "b2_today_conver",
+            "b2_today_click",
+            "b2_today_conver*log(view)",
+            "b2_today_conver*ctcvr",
+            "b3_1h_ctr",
+            "b3_1h_ctcvr",
+            "b3_1h_cvr",
+            "b3_1h_conver",
+            "b3_1h_click",
+            "b3_1h_conver*log(view)",
+            "b3_1h_conver*ctcvr",
+            "b3_2h_ctr",
+            "b3_2h_ctcvr",
+            "b3_2h_cvr",
+            "b3_2h_conver",
+            "b3_2h_click",
+            "b3_2h_conver*log(view)",
+            "b3_2h_conver*ctcvr",
+            "b3_3h_ctr",
+            "b3_3h_ctcvr",
+            "b3_3h_cvr",
+            "b3_3h_conver",
+            "b3_3h_click",
+            "b3_3h_conver*log(view)",
+            "b3_3h_conver*ctcvr",
+            "b3_6h_ctr",
+            "b3_6h_ctcvr",
+            "b3_6h_cvr",
+            "b3_6h_conver",
+            "b3_6h_click",
+            "b3_6h_conver*log(view)",
+            "b3_6h_conver*ctcvr",
+            "b3_12h_ctr",
+            "b3_12h_ctcvr",
+            "b3_12h_cvr",
+            "b3_12h_conver",
+            "b3_12h_click",
+            "b3_12h_conver*log(view)",
+            "b3_12h_conver*ctcvr",
+            "b3_1d_ctr",
+            "b3_1d_ctcvr",
+            "b3_1d_cvr",
+            "b3_1d_conver",
+            "b3_1d_click",
+            "b3_1d_conver*log(view)",
+            "b3_1d_conver*ctcvr",
+            "b3_3d_ctr",
+            "b3_3d_ctcvr",
+            "b3_3d_cvr",
+            "b3_3d_conver",
+            "b3_3d_click",
+            "b3_3d_conver*log(view)",
+            "b3_3d_conver*ctcvr",
+            "b3_7d_ctr",
+            "b3_7d_ctcvr",
+            "b3_7d_cvr",
+            "b3_7d_conver",
+            "b3_7d_click",
+            "b3_7d_conver*log(view)",
+            "b3_7d_conver*ctcvr",
+            "b3_yesterday_ctr",
+            "b3_yesterday_ctcvr",
+            "b3_yesterday_cvr",
+            "b3_yesterday_conver",
+            "b3_yesterday_click",
+            "b3_yesterday_conver*log(view)",
+            "b3_yesterday_conver*ctcvr",
+            "b3_today_ctr",
+            "b3_today_ctcvr",
+            "b3_today_cvr",
+            "b3_today_conver",
+            "b3_today_click",
+            "b3_today_conver*log(view)",
+            "b3_today_conver*ctcvr",
+            "b4_1h_ctr",
+            "b4_1h_ctcvr",
+            "b4_1h_cvr",
+            "b4_1h_conver",
+            "b4_1h_click",
+            "b4_1h_conver*log(view)",
+            "b4_1h_conver*ctcvr",
+            "b4_2h_ctr",
+            "b4_2h_ctcvr",
+            "b4_2h_cvr",
+            "b4_2h_conver",
+            "b4_2h_click",
+            "b4_2h_conver*log(view)",
+            "b4_2h_conver*ctcvr",
+            "b4_3h_ctr",
+            "b4_3h_ctcvr",
+            "b4_3h_cvr",
+            "b4_3h_conver",
+            "b4_3h_click",
+            "b4_3h_conver*log(view)",
+            "b4_3h_conver*ctcvr",
+            "b4_6h_ctr",
+            "b4_6h_ctcvr",
+            "b4_6h_cvr",
+            "b4_6h_conver",
+            "b4_6h_click",
+            "b4_6h_conver*log(view)",
+            "b4_6h_conver*ctcvr",
+            "b4_12h_ctr",
+            "b4_12h_ctcvr",
+            "b4_12h_cvr",
+            "b4_12h_conver",
+            "b4_12h_click",
+            "b4_12h_conver*log(view)",
+            "b4_12h_conver*ctcvr",
+            "b4_1d_ctr",
+            "b4_1d_ctcvr",
+            "b4_1d_cvr",
+            "b4_1d_conver",
+            "b4_1d_click",
+            "b4_1d_conver*log(view)",
+            "b4_1d_conver*ctcvr",
+            "b4_3d_ctr",
+            "b4_3d_ctcvr",
+            "b4_3d_cvr",
+            "b4_3d_conver",
+            "b4_3d_click",
+            "b4_3d_conver*log(view)",
+            "b4_3d_conver*ctcvr",
+            "b4_7d_ctr",
+            "b4_7d_ctcvr",
+            "b4_7d_cvr",
+            "b4_7d_conver",
+            "b4_7d_click",
+            "b4_7d_conver*log(view)",
+            "b4_7d_conver*ctcvr",
+            "b4_yesterday_ctr",
+            "b4_yesterday_ctcvr",
+            "b4_yesterday_cvr",
+            "b4_yesterday_conver",
+            "b4_yesterday_click",
+            "b4_yesterday_conver*log(view)",
+            "b4_yesterday_conver*ctcvr",
+            "b4_today_ctr",
+            "b4_today_ctcvr",
+            "b4_today_cvr",
+            "b4_today_conver",
+            "b4_today_click",
+            "b4_today_conver*log(view)",
+            "b4_today_conver*ctcvr",
+            "b5_1h_ctr",
+            "b5_1h_ctcvr",
+            "b5_1h_cvr",
+            "b5_1h_conver",
+            "b5_1h_click",
+            "b5_1h_conver*log(view)",
+            "b5_1h_conver*ctcvr",
+            "b5_2h_ctr",
+            "b5_2h_ctcvr",
+            "b5_2h_cvr",
+            "b5_2h_conver",
+            "b5_2h_click",
+            "b5_2h_conver*log(view)",
+            "b5_2h_conver*ctcvr",
+            "b5_3h_ctr",
+            "b5_3h_ctcvr",
+            "b5_3h_cvr",
+            "b5_3h_conver",
+            "b5_3h_click",
+            "b5_3h_conver*log(view)",
+            "b5_3h_conver*ctcvr",
+            "b5_6h_ctr",
+            "b5_6h_ctcvr",
+            "b5_6h_cvr",
+            "b5_6h_conver",
+            "b5_6h_click",
+            "b5_6h_conver*log(view)",
+            "b5_6h_conver*ctcvr",
+            "b5_12h_ctr",
+            "b5_12h_ctcvr",
+            "b5_12h_cvr",
+            "b5_12h_conver",
+            "b5_12h_click",
+            "b5_12h_conver*log(view)",
+            "b5_12h_conver*ctcvr",
+            "b5_1d_ctr",
+            "b5_1d_ctcvr",
+            "b5_1d_cvr",
+            "b5_1d_conver",
+            "b5_1d_click",
+            "b5_1d_conver*log(view)",
+            "b5_1d_conver*ctcvr",
+            "b5_3d_ctr",
+            "b5_3d_ctcvr",
+            "b5_3d_cvr",
+            "b5_3d_conver",
+            "b5_3d_click",
+            "b5_3d_conver*log(view)",
+            "b5_3d_conver*ctcvr",
+            "b5_7d_ctr",
+            "b5_7d_ctcvr",
+            "b5_7d_cvr",
+            "b5_7d_conver",
+            "b5_7d_click",
+            "b5_7d_conver*log(view)",
+            "b5_7d_conver*ctcvr",
+            "b5_yesterday_ctr",
+            "b5_yesterday_ctcvr",
+            "b5_yesterday_cvr",
+            "b5_yesterday_conver",
+            "b5_yesterday_click",
+            "b5_yesterday_conver*log(view)",
+            "b5_yesterday_conver*ctcvr",
+            "b5_today_ctr",
+            "b5_today_ctcvr",
+            "b5_today_cvr",
+            "b5_today_conver",
+            "b5_today_click",
+            "b5_today_conver*log(view)",
+            "b5_today_conver*ctcvr",
+            "b8_1h_ctr",
+            "b8_1h_ctcvr",
+            "b8_1h_cvr",
+            "b8_1h_conver",
+            "b8_1h_click",
+            "b8_1h_conver*log(view)",
+            "b8_1h_conver*ctcvr",
+            "b8_2h_ctr",
+            "b8_2h_ctcvr",
+            "b8_2h_cvr",
+            "b8_2h_conver",
+            "b8_2h_click",
+            "b8_2h_conver*log(view)",
+            "b8_2h_conver*ctcvr",
+            "b8_3h_ctr",
+            "b8_3h_ctcvr",
+            "b8_3h_cvr",
+            "b8_3h_conver",
+            "b8_3h_click",
+            "b8_3h_conver*log(view)",
+            "b8_3h_conver*ctcvr",
+            "b8_6h_ctr",
+            "b8_6h_ctcvr",
+            "b8_6h_cvr",
+            "b8_6h_conver",
+            "b8_6h_click",
+            "b8_6h_conver*log(view)",
+            "b8_6h_conver*ctcvr",
+            "b8_12h_ctr",
+            "b8_12h_ctcvr",
+            "b8_12h_cvr",
+            "b8_12h_conver",
+            "b8_12h_click",
+            "b8_12h_conver*log(view)",
+            "b8_12h_conver*ctcvr",
+            "b8_1d_ctr",
+            "b8_1d_ctcvr",
+            "b8_1d_cvr",
+            "b8_1d_conver",
+            "b8_1d_click",
+            "b8_1d_conver*log(view)",
+            "b8_1d_conver*ctcvr",
+            "b8_3d_ctr",
+            "b8_3d_ctcvr",
+            "b8_3d_cvr",
+            "b8_3d_conver",
+            "b8_3d_click",
+            "b8_3d_conver*log(view)",
+            "b8_3d_conver*ctcvr",
+            "b8_7d_ctr",
+            "b8_7d_ctcvr",
+            "b8_7d_cvr",
+            "b8_7d_conver",
+            "b8_7d_click",
+            "b8_7d_conver*log(view)",
+            "b8_7d_conver*ctcvr",
+            "b8_yesterday_ctr",
+            "b8_yesterday_ctcvr",
+            "b8_yesterday_cvr",
+            "b8_yesterday_conver",
+            "b8_yesterday_click",
+            "b8_yesterday_conver*log(view)",
+            "b8_yesterday_conver*ctcvr",
+            "b8_today_ctr",
+            "b8_today_ctcvr",
+            "b8_today_cvr",
+            "b8_today_conver",
+            "b8_today_click",
+            "b8_today_conver*log(view)",
+            "b8_today_conver*ctcvr",
+            "b9_1h_ctr",
+            "b9_1h_ctcvr",
+            "b9_1h_cvr",
+            "b9_1h_conver",
+            "b9_1h_click",
+            "b9_1h_conver*log(view)",
+            "b9_1h_conver*ctcvr",
+            "b9_2h_ctr",
+            "b9_2h_ctcvr",
+            "b9_2h_cvr",
+            "b9_2h_conver",
+            "b9_2h_click",
+            "b9_2h_conver*log(view)",
+            "b9_2h_conver*ctcvr",
+            "b9_3h_ctr",
+            "b9_3h_ctcvr",
+            "b9_3h_cvr",
+            "b9_3h_conver",
+            "b9_3h_click",
+            "b9_3h_conver*log(view)",
+            "b9_3h_conver*ctcvr",
+            "b9_6h_ctr",
+            "b9_6h_ctcvr",
+            "b9_6h_cvr",
+            "b9_6h_conver",
+            "b9_6h_click",
+            "b9_6h_conver*log(view)",
+            "b9_6h_conver*ctcvr",
+            "b9_12h_ctr",
+            "b9_12h_ctcvr",
+            "b9_12h_cvr",
+            "b9_12h_conver",
+            "b9_12h_click",
+            "b9_12h_conver*log(view)",
+            "b9_12h_conver*ctcvr",
+            "b9_1d_ctr",
+            "b9_1d_ctcvr",
+            "b9_1d_cvr",
+            "b9_1d_conver",
+            "b9_1d_click",
+            "b9_1d_conver*log(view)",
+            "b9_1d_conver*ctcvr",
+            "b9_3d_ctr",
+            "b9_3d_ctcvr",
+            "b9_3d_cvr",
+            "b9_3d_conver",
+            "b9_3d_click",
+            "b9_3d_conver*log(view)",
+            "b9_3d_conver*ctcvr",
+            "b9_7d_ctr",
+            "b9_7d_ctcvr",
+            "b9_7d_cvr",
+            "b9_7d_conver",
+            "b9_7d_click",
+            "b9_7d_conver*log(view)",
+            "b9_7d_conver*ctcvr",
+            "b9_yesterday_ctr",
+            "b9_yesterday_ctcvr",
+            "b9_yesterday_cvr",
+            "b9_yesterday_conver",
+            "b9_yesterday_click",
+            "b9_yesterday_conver*log(view)",
+            "b9_yesterday_conver*ctcvr",
+            "b9_today_ctr",
+            "b9_today_ctcvr",
+            "b9_today_cvr",
+            "b9_today_conver",
+            "b9_today_click",
+            "b9_today_conver*log(view)",
+            "b9_today_conver*ctcvr",
+            "b6_7d_ctr",
+            "b6_7d_ctcvr",
+            "b6_7d_cvr",
+            "b6_7d_conver",
+            "b6_7d_click",
+            "b6_7d_conver*log(view)",
+            "b6_7d_conver*ctcvr",
+            "b6_14d_ctr",
+            "b6_14d_ctcvr",
+            "b6_14d_cvr",
+            "b6_14d_conver",
+            "b6_14d_click",
+            "b6_14d_conver*log(view)",
+            "b6_14d_conver*ctcvr",
+            "b7_7d_ctr",
+            "b7_7d_ctcvr",
+            "b7_7d_cvr",
+            "b7_7d_conver",
+            "b7_7d_click",
+            "b7_7d_conver*log(view)",
+            "b7_7d_conver*ctcvr",
+            "b7_14d_ctr",
+            "b7_14d_ctcvr",
+            "b7_14d_cvr",
+            "b7_14d_conver",
+            "b7_14d_click",
+            "b7_14d_conver*log(view)",
+            "b7_14d_conver*ctcvr",
+            "viewAll",
+            "clickAll",
+            "converAll",
+            "incomeAll",
+            "ctr_all",
+            "ctcvr_all",
+            "cvr_all",
+            "timediff_view",
+            "timediff_click",
+            "timediff_conver",
+            "actionstatic_view",
+            "actionstatic_click",
+            "actionstatic_conver",
+            "actionstatic_income",
+            "actionstatic_ctr",
+            "actionstatic_ctcvr",
+            "actionstatic_cvr",
+            "e1_tags_3d_matchnum",
+            "e1_tags_3d_maxscore",
+            "e1_tags_3d_avgscore",
+            "e1_tags_7d_matchnum",
+            "e1_tags_7d_maxscore",
+            "e1_tags_7d_avgscore",
+            "e1_tags_14d_matchnum",
+            "e1_tags_14d_maxscore",
+            "e1_tags_14d_avgscore",
+            "e2_tags_3d_matchnum",
+            "e2_tags_3d_maxscore",
+            "e2_tags_3d_avgscore",
+            "e2_tags_7d_matchnum",
+            "e2_tags_7d_maxscore",
+            "e2_tags_7d_avgscore",
+            "e2_tags_14d_matchnum",
+            "e2_tags_14d_maxscore",
+            "e2_tags_14d_avgscore",
+            "d1_feature_3h_ctr",
+            "d1_feature_3h_ctcvr",
+            "d1_feature_3h_cvr",
+            "d1_feature_3h_conver",
+            "d1_feature_6h_ctr",
+            "d1_feature_6h_ctcvr",
+            "d1_feature_6h_cvr",
+            "d1_feature_6h_conver",
+            "d1_feature_12h_ctr",
+            "d1_feature_12h_ctcvr",
+            "d1_feature_12h_cvr",
+            "d1_feature_12h_conver",
+            "d1_feature_1d_ctr",
+            "d1_feature_1d_ctcvr",
+            "d1_feature_1d_cvr",
+            "d1_feature_1d_conver",
+            "d1_feature_3d_ctr",
+            "d1_feature_3d_ctcvr",
+            "d1_feature_3d_cvr",
+            "d1_feature_3d_conver",
+            "d1_feature_7d_ctr",
+            "d1_feature_7d_ctcvr",
+            "d1_feature_7d_cvr",
+            "d1_feature_7d_conver",
+            "vid_rank_ctr_1d",
+            "vid_rank_ctr_3d",
+            "vid_rank_ctr_7d",
+            "vid_rank_ctr_14d",
+            "vid_rank_ctcvr_1d",
+            "vid_rank_ctcvr_3d",
+            "vid_rank_ctcvr_7d",
+            "vid_rank_ctcvr_14d",
+            "ctitle_vtitle_similarity"
+    };
+
+    @Override
+    public int getModelSize() {
+        if (this.model == null)
+            return 0;
+        return 1;
+    }
+
+    @Override
+    public boolean loadFromStream(InputStreamReader in) throws Exception {
+        return false;
+    }
+
+    public void cleanModel() {
+        this.model = null;
+    }
+
+    public Float score(Map<String, String> featureMap) {
+
+        try {
+            float[] values = new float[features.length];
+            for (int i = 0; i < features.length; i++) {
+                float v = NumberUtils.toFloat(featureMap.getOrDefault(features[i], "0.0"), 0.0f);
+                values[i] = v;
+            }
+            DMatrix dm = new DMatrix(values, 1, features.length, 0.0f);
+            float[][] result = model._booster().predict(dm, false, 100);
+            return result[0][0];
+        } catch (Exception e) {
+            return 0f;
+        }
+    }
+
+    @Override
+    public boolean loadFromStream(InputStream in) throws Exception {
+        String modelDir = PropertiesUtil.getString("model.xgboost.path");
+        CompressUtil.decompressGzFile(in, modelDir);
+        String absolutePath =new File(modelDir).getAbsolutePath();
+        XGBoostClassificationModel model2 = XGBoostClassificationModel.load("file://" + absolutePath);
+        model2.setMissing(0.0f);
+        this.model = model2;
+        return true;
+    }
+
+}

+ 123 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/CompressUtil.java

@@ -0,0 +1,123 @@
+package com.tzld.piaoquan.ad.engine.commons.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+/**
+ * @author dyp
+ */
+@Slf4j
+public class CompressUtil {
+    public static void compressDirectoryToGzip(String sourceDirPath, String outputFilePath) {
+        // 创建.gz文件的输出流
+        try (OutputStream out = new FileOutputStream(outputFilePath);
+             GzipCompressorOutputStream gzipOut = new GzipCompressorOutputStream(out);
+             TarArchiveOutputStream taos = new TarArchiveOutputStream(gzipOut)) {
+
+            taos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
+
+            // 遍历目录
+            Files.walk(Paths.get(sourceDirPath))
+                    .filter(Files::isRegularFile)
+                    .forEach(filePath -> {
+                        try {
+                            // 为每个文件创建TarEntry
+                            TarArchiveEntry entry = new TarArchiveEntry(filePath.toFile(), filePath.toString().substring(sourceDirPath.length() + 1));
+                            taos.putArchiveEntry(entry);
+
+                            // 读取文件内容并写入TarArchiveOutputStream
+                            try (InputStream is = Files.newInputStream(filePath)) {
+                                byte[] buffer = new byte[1024];
+                                int len;
+                                while ((len = is.read(buffer)) > 0) {
+                                    taos.write(buffer, 0, len);
+                                }
+                            }
+                            // 关闭entry
+                            taos.closeArchiveEntry();
+                        } catch (IOException e) {
+                            log.error("", e);
+                        }
+                    });
+        } catch (Exception e) {
+            log.error("", e);
+        }
+    }
+
+    public static void decompressGzFile(String gzipFilePath, String destDirPath) {
+        try (InputStream gzipIn = new FileInputStream(gzipFilePath);
+             GzipCompressorInputStream gzIn = new GzipCompressorInputStream(gzipIn);
+             TarArchiveInputStream tais = new TarArchiveInputStream(gzIn)) {
+
+            TarArchiveEntry entry;
+            Files.createDirectories(Paths.get(destDirPath));
+            while ((entry = tais.getNextTarEntry()) != null) {
+                if (entry.isDirectory()) {
+                    // 如果是目录,创建目录
+                    Files.createDirectories(Paths.get(destDirPath, entry.getName()));
+                } else {
+                    // 如果是文件,创建文件并写入内容
+                    File outputFile = new File(destDirPath, entry.getName());
+                    if (!outputFile.exists()) {
+                        File parent = outputFile.getParentFile();
+                        if (!parent.exists()) {
+                            parent.mkdirs();
+                        }
+                        outputFile.createNewFile();
+                    }
+                    try (OutputStream out = new FileOutputStream(outputFile)) {
+                        byte[] buffer = new byte[1024];
+                        int len;
+                        while ((len = tais.read(buffer)) > 0) {
+                            out.write(buffer, 0, len);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("", e);
+        }
+    }
+
+    public static void decompressGzFile(InputStream gzipIn, String destDirPath) {
+        try (GzipCompressorInputStream gzIn = new GzipCompressorInputStream(gzipIn);
+             TarArchiveInputStream tais = new TarArchiveInputStream(gzIn)) {
+
+            TarArchiveEntry entry;
+            Files.createDirectories(Paths.get(destDirPath));
+            while ((entry = tais.getNextTarEntry()) != null) {
+                if (entry.isDirectory()) {
+                    // 如果是目录,创建目录
+                    Files.createDirectories(Paths.get(destDirPath, entry.getName()));
+                } else {
+                    // 如果是文件,创建文件并写入内容
+                    File outputFile = new File(destDirPath, entry.getName());
+                    if (!outputFile.exists()) {
+                        File parent = outputFile.getParentFile();
+                        if (!parent.exists()) {
+                            parent.mkdirs();
+                        }
+                        outputFile.createNewFile();
+                    }
+                    try (OutputStream out = new FileOutputStream(outputFile)) {
+                        byte[] buffer = new byte[1024];
+                        int len;
+                        while ((len = tais.read(buffer)) > 0) {
+                            out.write(buffer, 0, len);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("", e);
+        }
+    }
+}

+ 16 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/DateUtils.java

@@ -1,6 +1,9 @@
 package com.tzld.piaoquan.ad.engine.commons.util;
 
 import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.Calendar;
 import java.util.Date;
 
@@ -27,4 +30,17 @@ public final class DateUtils {
         Date previousDate = calendar.getTime();
         return dateFormat.format(previousDate);
     }
+
+    public static int getHourByTimestamp(long timestamp) {
+        return LocalDateTime
+                .ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.systemDefault())
+                .getHour();
+    }
+
+    public static int getDayOrWeekByTimestamp(long timestamp) {
+        return LocalDateTime
+                .ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.systemDefault())
+                .getDayOfWeek()
+                .getValue();
+    }
 }

+ 12 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/ObjUtil.java

@@ -0,0 +1,12 @@
+package com.tzld.piaoquan.ad.engine.commons.util;
+
+import java.util.Objects;
+
+public class ObjUtil {
+    public static <T> T nullOrDefault(T object, T defaultValue) {
+        if (Objects.isNull(object)) {
+            return defaultValue;
+        }
+        return object;
+    }
+}

+ 22 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/PropertiesUtil.java

@@ -0,0 +1,22 @@
+package com.tzld.piaoquan.ad.engine.commons.util;
+
+import org.springframework.context.EnvironmentAware;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PropertiesUtil implements EnvironmentAware {
+
+
+    private static Environment environment;
+
+
+    @Override
+    public void setEnvironment(Environment environment) {
+        this.environment = environment;
+    }
+
+    public static String getString(String name) {
+        return environment.getProperty(name);
+    }
+}

+ 6 - 0
ad-engine-server/pom.xml

@@ -16,6 +16,12 @@
             <groupId>com.tzld.piaoquan</groupId>
             <artifactId>ad-engine-service</artifactId>
             <version>1.0.3</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>log4j-slf4j-impl</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
     </dependencies>

+ 17 - 8
ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/AdRecommendController.java

@@ -5,6 +5,7 @@ import com.tzld.piaoquan.ad.engine.service.score.dto.AdPlatformCreativeDTO;
 import com.tzld.piaoquan.ad.engine.service.score.param.BidRankRecommendRequestParam;
 import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendRequestParam;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
+import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,20 +29,28 @@ public class AdRecommendController {
 
     @RequestMapping("/top1/basic")
     public Map<String, Object> adRecommendTop1Basic(@RequestBody RankRecommendRequestParam request) {
-        AdRankItem rankResult = rankService.adItemRank(request);
         Map<String, Object> map = new HashMap<>();
+        if (CollectionUtils.isEmpty(request.getAdIdList())) {
+            map.put("code", "1");
+            map.put("msg", "score error");
+            return map;
+        }
+
+        AdRankItem rankResult = rankService.adItemRank(request);
 
         if (Objects.isNull(rankResult)) {
             map.put("code", "1");
             map.put("msg", "score error");
-        } else {
-            map.put("code", "0");
-            map.put("msg", "success");
-            Map<String, Object> contentMap = new HashMap<>();
-            contentMap.put("adId", rankResult.getAdId());
-            contentMap.put("adScore", rankResult.getScore());
-            map.put("content", contentMap);
+            return map;
         }
+
+
+        map.put("code", "0");
+        map.put("msg", "success");
+        Map<String, Object> contentMap = new HashMap<>();
+        contentMap.put("adId", rankResult.getAdId());
+        contentMap.put("adScore", rankResult.getScore());
+        map.put("content", contentMap);
         return map;
     }
 

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 9 - 0
ad-engine-server/src/main/resources/20240718_ad_bucket_688.txt


+ 2 - 2
ad-engine-server/src/main/resources/ad_score_config_20240626.conf

@@ -1,8 +1,8 @@
 scorer-config = {
   lr-rov-score-config = {
-    scorer-name = "com.tzld.piaoquan.ad.engine.service.score.VlogRovLRScorer"
+    scorer-name = "com.tzld.piaoquan.ad.engine.service.score.VlogRovFMScorer"
     scorer-priority = 99
-    model-path = "zhangbo/model_bkb8_v3.txt"
+    model-path = "zhangbo/model_bkb8_v4.txt"
   }
 
 }

+ 8 - 0
ad-engine-server/src/main/resources/ad_score_config_20240813.conf

@@ -0,0 +1,8 @@
+scorer-config = {
+  lr-rov-score-config = {
+    scorer-name = "com.tzld.piaoquan.ad.engine.service.score.XGBoostScorer"
+    scorer-priority = 99
+    model-path = "zhangbo/model.tar.gz"
+  }
+
+}

+ 8 - 0
ad-engine-server/src/main/resources/ad_score_config_xgboost.conf

@@ -0,0 +1,8 @@
+scorer-config = {
+  lr-rov-score-config = {
+    scorer-name = "com.tzld.piaoquan.ad.engine.service.score.XGBoostScorer"
+    scorer-priority = 99
+    model-path = "zhangbo/model_xgb_1000.tar.gz"
+  }
+
+}

+ 3 - 3
ad-engine-server/src/main/resources/application-dev.yml

@@ -4,7 +4,7 @@ server:
 eureka:
   client:
     serviceUrl:
-      defaultZone: http://preeureka-internal.piaoquantv.com/eureka/
+      defaultZone: http://127.0.0.1:7000/eureka/
 
 datalog: .
 
@@ -27,8 +27,8 @@ spring:
       #password: wx2023_adP@assword1234
 
   redis-algorithm:
-#    hostName: r-bp1ps6my7lzg8rdhwx682.redis.rds.aliyuncs.com
-    hostName: r-bp1fogs2mflr1ybfot.redis.rds.aliyuncs.com
+    hostName: r-bp1ps6my7lzg8rdhwx682.redis.rds.aliyuncs.com
+    #hostName: r-bp1fogs2mflr1ybfot.redis.rds.aliyuncs.com
     port: 6379
     password: Wqsd@2019
     timeout: 1000

+ 6 - 1
ad-engine-server/src/main/resources/application.yml

@@ -6,6 +6,8 @@ eureka:
     lease-expiration-duration-in-seconds: 30 #表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance,默认90
   client:
     registry-fetch-interval-seconds: 5  #定时从Eureka Server拉取服务注册信息的间隔时间
+    serviceUrl:
+      defaultZone: http://deveureka-internal.piaoquantv.com/eureka/
 
 spring:
   datasource:
@@ -127,4 +129,7 @@ grpc:
     recommend-feature:
       negotiationType: PLAINTEXT
     recommend-server:
-      negotiationType: PLAINTEXT
+      negotiationType: PLAINTEXT
+model:
+  xgboost:
+    path: xgboost

+ 8 - 8
ad-engine-server/src/main/resources/logback.xml

@@ -55,7 +55,7 @@
         <file>${LOG_PATH}/debug.log</file>
         <!--日志文件输出格式-->
         <encoder>
-            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{pqtId}] %logger{50} [%L] - %msg%n</pattern>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{50} [%L] - %msg%n</pattern>
             <charset>UTF-8</charset> <!-- 设置字符集 -->
         </encoder>
         <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
@@ -85,7 +85,7 @@
         <file>${LOG_PATH}/info.log</file>
         <!--日志文件输出格式-->
         <encoder>
-            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{pqtId}] %logger{50} [%L] - %msg%n</pattern>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{50} [%L] - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
         <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
@@ -116,7 +116,7 @@
         <file>${LOG_PATH}/warn.log</file>
         <!--日志文件输出格式-->
         <encoder>
-            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{pqtId}] %logger{50} [%L] - %msg%n</pattern>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{50} [%L] - %msg%n</pattern>
             <charset>UTF-8</charset> <!-- 此处设置字符集 -->
         </encoder>
         <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
@@ -146,7 +146,7 @@
         <file>${LOG_PATH}/error.log</file>
         <!--日志文件输出格式-->
         <encoder>
-            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{pqtId}] %logger{50} [%L] - %msg%n</pattern>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{50} [%L] - %msg%n</pattern>
             <charset>UTF-8</charset> <!-- 此处设置字符集 -->
         </encoder>
         <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
@@ -188,7 +188,7 @@
         <maxRetryBackoffMs>50000</maxRetryBackoffMs>
 
         <encoder>
-            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{pqtId}] %logger{50} [%L] - %msg%n</pattern>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{50} [%L] - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
 
@@ -199,7 +199,7 @@
             <level>INFO</level>
         </filter>
 
-        <mdcFields>pqtId</mdcFields>
+        <mdcFields>traceId</mdcFields>
     </appender>
 
     <appender name="ALIYUN_LOG_ERROR" class="com.aliyun.openservices.log.logback.LoghubAppender">
@@ -220,7 +220,7 @@
         <maxRetryBackoffMs>50000</maxRetryBackoffMs>
 
         <encoder>
-            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{pqtId}] %logger{50} [%L] - %msg%n</pattern>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{50} [%L] - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
 
@@ -231,7 +231,7 @@
             <level>ERROR</level>
         </filter>
 
-        <mdcFields>pqtId</mdcFields>
+        <mdcFields>traceId</mdcFields>
     </appender>
 
     <!--

+ 1 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/feature/Feature.java

@@ -7,6 +7,7 @@ import java.util.Map;
 
 @Data
 public class Feature {
+
     // k1:创意、k2:表、k3:特征、v:特征值
     private Map<String, Map<String, Map<String, String>>> cidFeature = new HashMap<>();
 

+ 3 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/feature/FeatureService.java

@@ -54,7 +54,7 @@ public class FeatureService {
             }
 
             // cid + wechatversion
-            // protos.add(genWithCidAndWechatVersion("alg_cid_feature_weChatVersion_action", cidStr, context.getMachineinfoWechatversion()));
+            protos.add(genWithCidAndWechatVersion("alg_cid_feature_weChatVersion_action", cidStr, context.getMachineinfoWechatversion()));
 
             // cid + vid
             if (Objects.nonNull(param.getVideoId())) {
@@ -70,6 +70,7 @@ public class FeatureService {
         // vid
         if (Objects.nonNull(param.getVideoId())) {
             protos.add(genWithVid("alg_cid_feature_vid_cf_rank", param.getVideoId().toString()));
+            protos.add(genWithVid("alg_vid_feature_basic_info", param.getVideoId().toString()));
         }
 
         // mid
@@ -81,6 +82,7 @@ public class FeatureService {
 
         Map<String, String> featureMap = remoteService.getFeature(protos);
         featureMap = this.featureStrCover(featureMap);
+
         Feature feature = new Feature();
 
         for (Map.Entry<String, String> entry : featureMap.entrySet()) {

+ 8 - 15
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/log/impl/LogHubServiceImpl.java

@@ -54,7 +54,6 @@ public class LogHubServiceImpl implements LogHubService {
                 logMap.put("abcode", param.getAdAbGroup());
                 logMap.put("expid", abCode);
                 logMap.put("apptype", context.getApptype());
-                logMap.put("extinfo", new JSONObject());
 
                 // 获取AB实验列表
                 Set<String> abExpCode = new HashSet<>();
@@ -72,6 +71,7 @@ public class LogHubServiceImpl implements LogHubService {
                     JSONObject json = new JSONObject();
                     json.put("cid", rankItem.getAdId());
                     json.put("score", rankItem.getScore());
+                    rankItem.getScoreMap().put("score", rankItem.getScore());
                     json.put("scoremap", rankItem.getScoreMap());
                     JSONObject featureJson = new JSONObject();
                     for (Map.Entry<String, String> entry : rankItem.getFeatureMap().entrySet()) {
@@ -84,8 +84,9 @@ public class LogHubServiceImpl implements LogHubService {
                             featureJson.put(entry.getKey(), entry.getValue());
                         }
                     }
+
                     if (MapUtils.isNotEmpty(featureJson)) {
-                        json.put("feature", featureJson);
+                        json.put("allfeature", featureJson);
                     }
                     scoreResult.add(json);
                 }
@@ -100,21 +101,13 @@ public class LogHubServiceImpl implements LogHubService {
                 logMap.put("adid", top1.getId());
                 logMap.put("campaignid", top1.getCampaignId());
                 logMap.put("score", top1.getScore());
+                logMap.put("extinfo", JSON.toJSONString(top1.getExt()));
+
+
+                top1.getScoreMap().put("score", top1.getScore());
+                logMap.put("scoremap", JSON.toJSONString(top1.getScoreMap()));
                 logMap.put("allfeature", JSON.toJSONString(top1.getFeatureMap()));
                 logMap.put("metafeature", JSON.toJSONString(top1.getMetaFeatureMap()));
-                logMap.put("scoremap", JSON.toJSONString(top1.getScoreMap()));
-
-                // logMap.put("scorestrategy", scoreStrategy);
-                // logMap.put("creativeList", JSON.toJSONString(adIdList));
-                // if (Objects.nonNull(requestParam.getStatisticsLog())) {
-                //     extInfo.put("earlyAdIds", requestParam.getStatisticsLog().getEarlyAdIds());
-                //     extInfo.put("earlyCidList", requestParam.getStatisticsLog().getEarlyCreativeIds());
-                //     extInfo.put("finalCidList", requestParam.getStatisticsLog().getFinalCreativeIds());
-                //     extInfo.put("commonFilterAfterAdIds", requestParam.getStatisticsLog().getCommonFilterAfterAdIds());
-                //     extInfo.put("commonFilterAfterCidList", requestParam.getStatisticsLog().getCommonFilterAfterCreativeIds());
-                //     extInfo.put("tacticsFilterAfterAdIds", requestParam.getStatisticsLog().getTacticsFilterAfterAdIds());
-                //     extInfo.put("tacticsFilterAfterCidList", requestParam.getStatisticsLog().getTacticsFilterAfterCreativeIds());
-                // }
 
                 aliyunLogManager.sendLog(project, logStore, "", logMap);
             }

+ 9 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/RandomPredictModel.java

@@ -1,5 +1,6 @@
 package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
+import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.ad.engine.commons.util.DateUtils;
 import com.tzld.piaoquan.ad.engine.commons.util.JSONUtils;
 import com.tzld.piaoquan.ad.engine.service.predict.container.RandWContainer;
@@ -46,6 +47,14 @@ public class RandomPredictModel extends ThresholdPredictModel {
         result.put("score", score);
         result.put("threshold", threshold);
         result.put("model", "random");
+
+        JSONObject logJson = new JSONObject();
+        logJson.putAll(result);
+        logJson.put("mid", modelParam.getMid());
+        logJson.put("expId", "599");
+        logJson.put("appType", appType);
+        logJson.put("thresholdParamKey", thresholdParamKey);
+
         log.info("广告跳出选择 -- 599实验结果: {}, 参数: {}, {}, {}",
                 JSONUtils.toJson(result), appType, modelParam.getMid(), thresholdParamKey);
         return result;

+ 54 - 33
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/RankService680.java

@@ -1,9 +1,12 @@
 package com.tzld.piaoquan.ad.engine.service.score;
 
+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
 import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
 import com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils;
+import com.tzld.piaoquan.ad.engine.commons.util.DateUtils;
 import com.tzld.piaoquan.ad.engine.commons.util.ExtractorUtils;
 import com.tzld.piaoquan.ad.engine.commons.util.NumUtil;
+import com.tzld.piaoquan.ad.engine.commons.util.ObjUtil;
 import com.tzld.piaoquan.ad.engine.service.feature.Feature;
 import com.tzld.piaoquan.ad.engine.service.feature.FeatureService;
 import com.tzld.piaoquan.ad.engine.service.score.dto.AdPlatformCreativeDTO;
@@ -15,6 +18,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.xm.Similarity;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -27,8 +31,8 @@ import java.util.stream.Collectors;
 @Service
 public class RankService680 {
 
-    @Value("${id.feature.default.value:0.01}")
-    private String idDefaultValue;
+    @ApolloJsonValue("${no.postback.conversion.adverids:[]}")
+    private Set<String> noPostbackConversionAdVerIds;
 
     @Autowired
     private FeatureService featureService;
@@ -44,6 +48,7 @@ public class RankService680 {
 
         // 特征处理
         Feature feature = this.getFeature(scoreParam, request);
+
         Map<String, Map<String, String>> userFeature = feature.getUserFeature();
         Map<String, Map<String, String>> videoFeature = feature.getVideoFeature();
         Map<String, Map<String, Map<String, String>>> allAdVerFeature = feature.getAdVerFeature();
@@ -57,12 +62,14 @@ public class RankService680 {
         Map<String, Double> actionStaticMap = this.parseC1FeatureListToActionStaticMap(midActionList);
 
         Map<String, String> d2Feature = videoFeature.getOrDefault("alg_cid_feature_vid_cf_rank", new HashMap<>());
+        Map<String, String> d3Feature = videoFeature.getOrDefault("alg_vid_feature_basic_info", new HashMap<>());
 
         Map<String, Map<String, Double>> vidRankMaps = this.parseD2FeatureMap(d2Feature);
 
         Map<String, String> e1Feature = userFeature.getOrDefault("alg_mid_feature_return_tags", new HashMap<>());
         Map<String, String> e2Feature = userFeature.getOrDefault("alg_mid_feature_share_tags", new HashMap<>());
 
+        Map<String, String> sceneFeatureMap = this.handleSceneFeature(ts);
 
         List<AdRankItem> adRankItems = new ArrayList<>(request.getAdIdList().size());
         for (AdPlatformCreativeDTO dto : request.getAdIdList()) {
@@ -74,6 +81,7 @@ public class RankService680 {
             adRankItem.setCpa(dto.getCpa());
             adRankItem.setId(dto.getAdId());
             adRankItem.setCampaignId(dto.getCampaignId());
+            adRankItem.setCpm(ObjUtil.nullOrDefault(dto.getCpm(), 90).doubleValue());
 
             String cidStr = dto.getCreativeId().toString();
             Map<String, String> cidFeatureMap = new HashMap<>();
@@ -84,10 +92,9 @@ public class RankService680 {
 
             Map<String, String> d1Feature = cidFeature.getOrDefault("alg_cid_feature_vid_cf", new HashMap<>());
 
-
             this.handleB1Feature(b1Feature, cidFeatureMap, cidStr);
 
-            this.handleB2ToB5AndB8Feature(cidFeature, adVerFeature, cidFeatureMap);
+            this.handleB2ToB5AndB8ToB9Feature(cidFeature, adVerFeature, cidFeatureMap);
 
             this.handleB6ToB7Feature(cidFeature, cidFeatureMap);
 
@@ -100,6 +107,8 @@ public class RankService680 {
             String title = b1Feature.getOrDefault("cidtitle", "");
             this.handleE1AndE2Feature(e1Feature, e2Feature, title, cidFeatureMap);
 
+            this.handleD3AndB1Feature(d3Feature, title, cidFeatureMap);
+
             adRankItem.setFeatureMap(cidFeatureMap);
 
             adRankItems.add(adRankItem);
@@ -115,13 +124,19 @@ public class RankService680 {
         }
 
         // 打分排序
-        List<AdRankItem> result = ScorerUtils.getScorerPipeline(ScorerUtils.LR_ROV_SCORE_20240626)
-                .scoring(new HashMap<>(), userFeatureMap, adRankItems);
-
+        List<AdRankItem> result = ScorerUtils.getScorerPipeline(ScorerUtils.XGBOOST_SCORE_CONF)
+                .scoring(sceneFeatureMap, userFeatureMap, adRankItems);
         for (AdRankItem item : result) {
             item.setScore(item.getLrScore() * item.getCpa());
             item.getScoreMap().put("cpa", item.getCpa());
+            item.getScoreMap().put("cpm", item.getCpm());
             item.getFeatureMap().putAll(userFeatureMap);
+            item.getFeatureMap().putAll(sceneFeatureMap);
+
+            // 没有转化回传的广告主,使用后台配置的CPM
+            if (noPostbackConversionAdVerIds.contains(item.getAdVerId())) {
+                item.setScore(item.getCpm() / 1000);
+            }
 
             for (Map.Entry<String, Map<String, String>> entry : videoFeature.entrySet()) {
                 if (MapUtils.isNotEmpty(entry.getValue())) {
@@ -148,19 +163,6 @@ public class RankService680 {
                     item.getMetaFeatureMap().put(entry.getKey(), entry.getValue());
                 }
             }
-
-            // if (MapUtils.isNotEmpty(videoFeature)) {
-            //     item.getMetaFeatureMap().putAll(videoFeature);
-            // }
-            // if (MapUtils.isNotEmpty(userFeature)) {
-            //     item.getMetaFeatureMap().putAll(userFeature);
-            // }
-            // if (allAdVerFeature.containsKey(item.getAdVerId())) {
-            //     item.getMetaFeatureMap().putAll(allAdVerFeature.get(item.getAdVerId()));
-            // }
-            // if (allCidFeature.containsKey(String.valueOf(item.getAdId()))) {
-            //     item.getMetaFeatureMap().putAll(allCidFeature.get(String.valueOf(item.getAdId())));
-            // }
         }
 
         Collections.sort(result);
@@ -184,14 +186,14 @@ public class RankService680 {
     }
 
     private void handleB1Feature(Map<String, String> b1Feature, Map<String, String> cidFeatureMap, String cid) {
-        cidFeatureMap.put("cid_" + cid, "0.01");
+        cidFeatureMap.put("cid_" + cid, "0.1");
         // if (StringUtils.isNotBlank(b1Feature.get("adid"))) {
         //     String adId = b1Feature.get("adid");
         //     cidFeatureMap.put("adid_" + adId, idDefaultValue);
         // }
         if (StringUtils.isNotBlank(b1Feature.get("adverid"))) {
             String adVerId = b1Feature.get("adverid");
-            cidFeatureMap.put("adverid_" + adVerId, "0.01");
+            cidFeatureMap.put("adverid_" + adVerId, "0.1");
         }
         // if (StringUtils.isNotBlank(b1Feature.get("targeting_conversion"))) {
         //     String targetingConversion = b1Feature.get("targeting_conversion");
@@ -203,20 +205,22 @@ public class RankService680 {
         }
     }
 
-    private void handleB2ToB5AndB8Feature(Map<String, Map<String, String>> c1Feature, Map<String, Map<String, String>> adVerFeature, Map<String, String> cidFeatureMap) {
+    private void handleB2ToB5AndB8ToB9Feature(Map<String, Map<String, String>> c1Feature, Map<String, Map<String, String>> adVerFeature, Map<String, String> cidFeatureMap) {
         Map<String, String> b2Feature = adVerFeature.getOrDefault("alg_cid_feature_adver_action", new HashMap<>());
         Map<String, String> b3Feature = c1Feature.getOrDefault("alg_cid_feature_cid_action", new HashMap<>());
         Map<String, String> b4Feature = c1Feature.getOrDefault("alg_cid_feature_region_action", new HashMap<>());
         Map<String, String> b5Feature = c1Feature.getOrDefault("alg_cid_feature_app_action", new HashMap<>());
         Map<String, String> b8Feature = c1Feature.getOrDefault("alg_cid_feature_brand_action", new HashMap<>());
+        Map<String, String> b9Feature = c1Feature.getOrDefault("alg_cid_feature_weChatVersion_action", new HashMap<>());
 
-        List<String> timeList = Arrays.asList("3h", "6h", "12h", "1d", "3d", "7d");
+        List<String> timeList = Arrays.asList("1h", "2h", "3h", "6h", "12h", "1d", "3d", "7d", "yesterday", "today");
         List<Tuple2<Map<String, String>, String>> featureList = Arrays.asList(
                 new Tuple2<>(b2Feature, "b2"),
                 new Tuple2<>(b3Feature, "b3"),
                 new Tuple2<>(b4Feature, "b4"),
                 new Tuple2<>(b5Feature, "b5"),
-                new Tuple2<>(b8Feature, "b8")
+                new Tuple2<>(b8Feature, "b8"),
+                new Tuple2<>(b9Feature, "b9")
         );
         for (Tuple2<Map<String, String>, String> tuple2 : featureList) {
             Map<String, String> feature = tuple2.f1;
@@ -231,7 +235,7 @@ public class RankService680 {
                 cidFeatureMap.put(prefix + "_" + time + "_ctcvr", String.valueOf(f2));
                 cidFeatureMap.put(prefix + "_" + time + "_cvr", String.valueOf(NumUtil.div(conver, click)));
                 cidFeatureMap.put(prefix + "_" + time + "_conver", String.valueOf(conver));
-                cidFeatureMap.put(prefix + "_" + time + "_ecpm", String.valueOf(NumUtil.div(income * 1000, view)));
+                // cidFeatureMap.put(prefix + "_" + time + "_ecpm", String.valueOf(NumUtil.div(income * 1000, view)));
 
                 cidFeatureMap.put(prefix + "_" + time + "_click", String.valueOf(click));
                 cidFeatureMap.put(prefix + "_" + time + "_conver*log(view)", String.valueOf(conver * NumUtil.log(view)));
@@ -263,7 +267,7 @@ public class RankService680 {
                 cidFeatureMap.put(prefix + "_" + time + "_ctcvr", String.valueOf(f2));
                 cidFeatureMap.put(prefix + "_" + time + "_cvr", String.valueOf(NumUtil.div(conver, click)));
                 cidFeatureMap.put(prefix + "_" + time + "_conver", String.valueOf(conver));
-                cidFeatureMap.put(prefix + "_" + time + "_ecpm", String.valueOf(NumUtil.div(income * 1000, view)));
+                // cidFeatureMap.put(prefix + "_" + time + "_ecpm", String.valueOf(NumUtil.div(income * 1000, view)));
 
                 cidFeatureMap.put(prefix + "_" + time + "_click", String.valueOf(click));
                 cidFeatureMap.put(prefix + "_" + time + "_conver*log(view)", String.valueOf(conver * NumUtil.log(view)));
@@ -301,7 +305,7 @@ public class RankService680 {
         featureMap.put("ctr_all", String.valueOf(NumUtil.div(clickAll, viewAll)));
         featureMap.put("ctcvr_all", String.valueOf(NumUtil.div(converAll, viewAll)));
         featureMap.put("cvr_all", String.valueOf(NumUtil.div(clickAll, converAll)));
-        featureMap.put("ecpm_all", String.valueOf(NumUtil.div(incomeAll * 1000, viewAll)));
+        // featureMap.put("ecpm_all", String.valueOf(NumUtil.div(incomeAll * 1000, viewAll)));
 
         return midActionList;
     }
@@ -344,8 +348,8 @@ public class RankService680 {
         }
         if (midActionStatic.containsKey("actionstatic_conver_" + cid) && midActionStatic.containsKey("actionstatic_click_" + cid)) {
             double cvr = NumUtil.div(
-                    midActionStatic.getOrDefault("actionstatic_click_" + cid, 0.0),
-                    midActionStatic.getOrDefault("actionstatic_conver_" + cid, 0.0)
+                    midActionStatic.getOrDefault("actionstatic_conver_" + cid, 0.0),
+                    midActionStatic.getOrDefault("actionstatic_click_" + cid, 0.0)
             );
             featureMap.put("actionstatic_cvr", String.valueOf(cvr));
         }
@@ -361,7 +365,7 @@ public class RankService680 {
             featureMap.put("d1_feature_" + prefix + "_ctcvr", String.valueOf(NumUtil.div(conver, view)));
             featureMap.put("d1_feature_" + prefix + "_cvr", String.valueOf(NumUtil.div(conver, click)));
             featureMap.put("d1_feature_" + prefix + "_conver", String.valueOf(conver));
-            featureMap.put("d1_feature_" + prefix + "_ecpm", String.valueOf(NumUtil.div(income * 1000, view)));
+            // featureMap.put("d1_feature_" + prefix + "_ecpm", String.valueOf(NumUtil.div(income * 1000, view)));
         }
     }
 
@@ -370,7 +374,8 @@ public class RankService680 {
             return;
         }
 
-        List<String> prefixes1 = Arrays.asList("ctr", "ctcvr", "ecpm");
+        // List<String> prefixes1 = Arrays.asList("ctr", "ctcvr", "ecpm");
+        List<String> prefixes1 = Arrays.asList("ctr", "ctcvr");
         List<String> prefixes2 = Arrays.asList("1d", "3d", "7d", "14d");
 
         for (String prefix1 : prefixes1) {
@@ -386,6 +391,15 @@ public class RankService680 {
         }
     }
 
+    private void handleD3AndB1Feature(Map<String, String> d3Feature, String cTitle, Map<String, String> featureMap) {
+        if (MapUtils.isEmpty(d3Feature) || !d3Feature.containsKey("title") || StringUtils.isEmpty(cTitle)) {
+            return;
+        }
+        String vTitle = d3Feature.get("title");
+        double score = Similarity.conceptSimilarity(cTitle, vTitle);
+        featureMap.put("ctitle_vtitle_similarity", String.valueOf(score));
+    }
+
     private void handleE1AndE2Feature(Map<String, String> e1Feature, Map<String, String> e2Feature, String title, Map<String, String> featureMap) {
         if (StringUtils.isEmpty(title)) {
             return;
@@ -474,12 +488,19 @@ public class RankService680 {
         return vidRankMaps;
     }
 
+    public Map<String, String> handleSceneFeature(long ts) {
+        Map<String, String> sceneFeatureMap = new HashMap<>();
+        sceneFeatureMap.put("hour_" + DateUtils.getHourByTimestamp(ts), "0.1");
+        sceneFeatureMap.put("dayofweek_" + DateUtils.getDayOrWeekByTimestamp(ts), "0.1");
+        return sceneFeatureMap;
+    }
+
     private void readBucketFile() {
         if (MapUtils.isNotEmpty(bucketsMap)) {
             return;
         }
         synchronized (this) {
-            InputStream resourceStream = RankService680.class.getClassLoader().getResourceAsStream("20240704_ad_bucket_351.txt");
+            InputStream resourceStream = RankService680.class.getClassLoader().getResourceAsStream("20240718_ad_bucket_688.txt");
             if (resourceStream != null) {
                 try (BufferedReader reader = new BufferedReader(new InputStreamReader(resourceStream))) {
                     Map<String, double[]> bucketsMap = new HashMap<>();

+ 156 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/XGBoostScorer.java

@@ -0,0 +1,156 @@
+package com.tzld.piaoquan.ad.engine.service.score;
+
+
+import com.tzld.piaoquan.ad.engine.commons.score.BaseXGBoostModelScorer;
+import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
+import com.tzld.piaoquan.ad.engine.commons.score.ScorerConfigInfo;
+import com.tzld.piaoquan.ad.engine.commons.score.model.XGBoostModel;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.UserAdFeature;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+import java.util.concurrent.*;
+
+
+public class XGBoostScorer extends BaseXGBoostModelScorer {
+
+    private static final int LOCAL_TIME_OUT = 150;
+    private final static Logger LOGGER = LoggerFactory.getLogger(XGBoostScorer.class);
+    private static final ExecutorService executorService = Executors.newFixedThreadPool(128);
+
+
+    public XGBoostScorer(ScorerConfigInfo configInfo) {
+        super(configInfo);
+    }
+
+    @Override
+    public List<AdRankItem> scoring(final ScoreParam param,
+                                    final UserAdFeature userAdFeature,
+                                    final List<AdRankItem> rankItems) {
+        throw new NoSuchMethodError();
+    }
+
+    public List<AdRankItem> scoring(final Map<String, String> sceneFeatureMap,
+                                    final Map<String, String> userFeatureMap,
+                                    final List<AdRankItem> rankItems) {
+        if (CollectionUtils.isEmpty(rankItems)) {
+            return rankItems;
+        }
+
+        long startTime = System.currentTimeMillis();
+
+        List<AdRankItem> result = rankByJava(sceneFeatureMap, userFeatureMap, rankItems);
+
+        LOGGER.debug("ctr ranker time java items size={}, time={} ", result != null ? result.size() : 0,
+                System.currentTimeMillis() - startTime);
+
+        return result;
+    }
+
+    private List<AdRankItem> rankByJava(final Map<String, String> sceneFeatureMap,
+                                      final Map<String, String> userFeatureMap,
+                                      final List<AdRankItem> items) {
+        long startTime = System.currentTimeMillis();
+        XGBoostModel model = (XGBoostModel) this.getModel();
+        LOGGER.debug("model size: [{}]", model.getModelSize());
+
+        // 所有都参与打分,按照ctr排序
+        multipleCtrScore(items, userFeatureMap, sceneFeatureMap, model);
+
+        // debug log
+        if (LOGGER.isDebugEnabled()) {
+            for (int i = 0; i < items.size(); i++) {
+                LOGGER.debug("before enter feeds model predict ctr score [{}] [{}]", items.get(i), items.get(i));
+            }
+        }
+
+        Collections.sort(items);
+
+        LOGGER.debug("ctr ranker java execute time: [{}]", System.currentTimeMillis() - startTime);
+        LOGGER.debug("[ctr ranker time java] items size={}, cost={} ", items != null ? items.size() : 0,
+                System.currentTimeMillis() - startTime);
+        return items;
+    }
+
+    private void multipleCtrScore(final List<AdRankItem> items,
+                                  final Map<String, String> userFeatureMap,
+                                  final Map<String, String> sceneFeatureMap,
+                                  final XGBoostModel model) {
+
+        List<Callable<Object>> calls = new ArrayList<Callable<Object>>();
+        for (int index = 0; index < items.size(); index++) {
+            final int fIndex = index;
+            calls.add(new Callable<Object>() {
+                @Override
+                public Object call() throws Exception {
+                    try {
+                        calcScore(model, items.get(fIndex), userFeatureMap, sceneFeatureMap);
+                    } catch (Exception e) {
+                        LOGGER.error("ctr exception: [{}] [{}]", items.get(fIndex), ExceptionUtils.getFullStackTrace(e));
+                    }
+                    return new Object();
+                }
+            });
+        }
+
+        List<Future<Object>> futures = null;
+        try {
+            futures = executorService.invokeAll(calls, LOCAL_TIME_OUT, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            LOGGER.error("execute invoke fail: {}", ExceptionUtils.getFullStackTrace(e));
+        }
+
+        // 等待所有请求的结果返回, 超时也返回
+        int cancel = 0;
+        if (futures != null) {
+            for (Future<Object> future : futures) {
+                try {
+                    if (!future.isDone() || future.isCancelled() || future.get() == null) {
+                        cancel++;
+                    }
+                } catch (InterruptedException e) {
+                    LOGGER.error("InterruptedException {},{}", ExceptionUtils.getFullStackTrace(e));
+                } catch (ExecutionException e) {
+                    LOGGER.error("ExecutionException {},{}", sceneFeatureMap.size(),
+                            ExceptionUtils.getFullStackTrace(e));
+                }
+            }
+        }
+    }
+
+    public double calcScore(final XGBoostModel model,
+                            final AdRankItem item,
+                            final Map<String, String> userFeatureMap,
+                            final Map<String, String> sceneFeatureMap) {
+
+
+        Map<String, String> featureMap = new HashMap<>();
+        if (MapUtils.isNotEmpty(item.getFeatureMap())) {
+            featureMap.putAll(item.getFeatureMap());
+        }
+        if (MapUtils.isNotEmpty(userFeatureMap)) {
+            featureMap.putAll(userFeatureMap);
+        }
+        if (MapUtils.isNotEmpty(sceneFeatureMap)) {
+            featureMap.putAll(sceneFeatureMap);
+        }
+
+        double pro = 0.0;
+        if (MapUtils.isNotEmpty(featureMap)) {
+            try {
+                pro = model.score(featureMap);
+                // LOGGER.info("fea : {}, score:{}", JSONUtils.toJson(featureMap), pro);
+            } catch (Exception e) {
+                LOGGER.error("score error for doc={} exception={}", item.getVideoId(), ExceptionUtils.getFullStackTrace(e));
+            }
+        }
+        item.setLrScore(pro);
+        item.getScoreMap().put("ctcvrScore", pro);
+        return pro;
+    }
+}

+ 14 - 14
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/container/PidLambdaContainer.java

@@ -68,20 +68,20 @@ public class PidLambdaContainer {
     private static ConcurrentHashMap<Long, V1CacheItem>  lambdaCache=new ConcurrentHashMap<>();
     private Date cacheDate;
 
-    @PostConstruct
-    private void init(){
-        instanceClient();
-        final Runnable task = new Runnable() {
-            public void run() {
-                try {
-                    loadAndCalIfNeed();
-                }catch (Exception e){
-                    e.printStackTrace();
-                }
-            }
-        };
-        scheduler.scheduleAtFixedRate(task, 0, SCHEDULE_PERIOD, TimeUnit.MINUTES); // 10分钟
-    }
+    // @PostConstruct
+    // private void init(){
+    //     instanceClient();
+    //     final Runnable task = new Runnable() {
+    //         public void run() {
+    //             try {
+    //                 loadAndCalIfNeed();
+    //             }catch (Exception e){
+    //                 e.printStackTrace();
+    //             }
+    //         }
+    //     };
+    //     scheduler.scheduleAtFixedRate(task, 0, SCHEDULE_PERIOD, TimeUnit.MINUTES); // 10分钟
+    // }
 
     private void instanceClient(){
         CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKetSecret);

+ 14 - 14
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/container/PidLambdaV2Container.java

@@ -67,20 +67,20 @@ public class PidLambdaV2Container {
     private static ConcurrentHashMap<Long,CacheItem>  lambdaCache=new ConcurrentHashMap<>();
     private Date cacheDate;
 
-    @PostConstruct
-    private void init(){
-        instanceClient();
-        final Runnable task = new Runnable() {
-            public void run() {
-                try {
-                    loadAndCalIfNeed();
-                }catch (Exception e){
-                    e.printStackTrace();
-                }
-            }
-        };
-        scheduler.scheduleAtFixedRate(task, 0, SCHEDULE_PERIOD, TimeUnit.MINUTES); // 10分钟
-    }
+    // @PostConstruct
+    // private void init(){
+    //     instanceClient();
+    //     final Runnable task = new Runnable() {
+    //         public void run() {
+    //             try {
+    //                 loadAndCalIfNeed();
+    //             }catch (Exception e){
+    //                 e.printStackTrace();
+    //             }
+    //         }
+    //     };
+    //     scheduler.scheduleAtFixedRate(task, 0, SCHEDULE_PERIOD, TimeUnit.MINUTES); // 10分钟
+    // }
 
     private void instanceClient(){
         CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKetSecret);

+ 2 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/dto/AdPlatformCreativeDTO.java

@@ -21,6 +21,8 @@ public class AdPlatformCreativeDTO {
 
     private Double cpa;
 
+    private Double cpm;
+
     private Double bid1;
 
     private Double bid2;

+ 3 - 10
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/RankServiceImpl.java

@@ -91,16 +91,9 @@ public class RankServiceImpl implements RankService {
     private AdRankItem rankBy680(RankRecommendRequestParam request) {
         ScoreParam scoreParam = RequestConvert.requestConvert(request);
         List<AdRankItem> adRankItems = fmRankService.adItemRank(request, scoreParam);
-        // List<JSONObject> collect = adRankItems.stream().map(i -> {
-        //     JSONObject json = new JSONObject();
-        //     json.put("cid", i.getAdId());
-        //     json.put("lrScore", i.getLrScore());
-        //     json.put("score", i.getScore());
-        //     json.put("metaFeatureMap", i.getMetaFeatureMap());
-        //     json.put("allFeatureMap", i.getFeatureMap());
-        //     return json;
-        // }).collect(Collectors.toList());
-        // log.info("LR模型打分结果: {}", JSON.toJSONString(collect));
+        for (AdRankItem adRankItem : adRankItems) {
+            log.info("adRankItem: {}", JSON.toJSONString(adRankItem));
+        }
         logHubService.scoreLogUpload(scoreParam, request.getAdIdList(), adRankItems, request, "LRModelScore", "680");
         return adRankItems.get(0);
     }

+ 11 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/TacticsAndLRModelScoreRankService.java

@@ -1,5 +1,6 @@
 package com.tzld.piaoquan.ad.engine.service.score.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
 import com.tzld.piaoquan.ad.engine.commons.util.NumUtil;
 import com.tzld.piaoquan.ad.engine.service.score.RankService680;
@@ -27,6 +28,15 @@ public class TacticsAndLRModelScoreRankService {
         // LR模型打分结果
         List<AdRankItem> result = rankService680.adItemRank(requestParam, scoreParam);
 
+        // List<JSONObject> collect = result.stream().map(item -> {
+        //     JSONObject json = new JSONObject();
+        //     json.put("cid", item.getAdId());
+        //     json.put("score", item.getScore());
+        //     json.put("modelScore", item.getLrScore());
+        //     json.put("allfeature", item.getFeatureMap());
+        //     return json;
+        // }).collect(Collectors.toList());
+
         Map<Long, AdDirectionScore> adDirectionScoreMap = requestParam.getAdIdList().stream()
                 .collect(Collectors.toMap(AdPlatformCreativeDTO::getCreativeId, AdPlatformCreativeDTO::getAdDirectionScore));
 
@@ -77,7 +87,7 @@ public class TacticsAndLRModelScoreRankService {
         Map<String, String> scoreDetailMap = new HashMap<>(scoreDetail);
         scoreDetailMap.put("exponent", String.valueOf(exponent));
         scoreDetailMap.put("excludeMin", String.valueOf(excludeMin));
-        adRankItem.getMetaFeatureMap().put("adDirectionScoreDetail", scoreDetailMap);
+        adRankItem.getFeatureMap().putAll(scoreDetailMap);
     }
 
 }

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov