| 
					
				 | 
			
			
				@@ -2,6 +2,7 @@ package com.tzld.piaoquan.recommend.server.service.rank.strategy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.alibaba.fastjson.JSONObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.google.common.reflect.TypeToken; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.tzld.piaoquan.recommend.server.model.Video; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.tzld.piaoquan.recommend.server.service.rank.RankParam; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -9,8 +10,7 @@ import com.tzld.piaoquan.recommend.server.service.rank.RankResult; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.tzld.piaoquan.recommend.server.service.rank.RankService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.tzld.piaoquan.recommend.server.service.rank.extractor.RankExtractorFeature; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.tzld.piaoquan.recommend.server.service.rank.processor.RankProcessorDensity; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.tzld.piaoquan.recommend.server.service.recall.RecallResult; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.tzld.piaoquan.recommend.server.service.recall.strategy.SpecialRecallStrategy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.recommend.server.service.rank.processor.RankProcessorTagFilter; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.tzld.piaoquan.recommend.server.util.JSONUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import lombok.extern.slf4j.Slf4j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.commons.collections4.CollectionUtils; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -27,20 +27,10 @@ import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Service 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Slf4j 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 public class RankStrategy4Density extends RankService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @ApolloJsonValue("${RankStrategy4DensityFilter:}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private Map<String,Map<String, Map<String, String>>> filterRules; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public RankResult mergeAndSort(RankParam param, List<Video> rovRecallRank, List<Video> flowPoolRank) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 测试,添加数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        rovRecallRank.add(0, getTestVideo(1070462L, "")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        rovRecallRank.add(0, getTestVideo(1085062L, "")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        rovRecallRank.add(0, getTestVideo(1102552L, "")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        rovRecallRank.add(0, getTestVideo(1115929L, "")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        flowPoolRank = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        flowPoolRank.add(getTestVideo(1263931L, "flow")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        flowPoolRank.add(getTestVideo(1284797L, "flow")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        flowPoolRank.add(getTestVideo(1289001L, "flow")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        flowPoolRank.add(getTestVideo(1331503L, "flow")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (CollectionUtils.isEmpty(rovRecallRank)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (param.getSize() < flowPoolRank.size()) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -49,31 +39,44 @@ public class RankStrategy4Density extends RankService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return new RankResult(flowPoolRank); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 1 读取多样性密度控制规则 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        String appType = String.valueOf(param.getAppType()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        String ruleStr = this.redisTemplate.opsForValue().get("TAGS_FILTER_RULE_V1_JSON"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 1 读取多样性密度控制规则------------------ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        String appType = String.valueOf(param.getAppType()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        String ruleStr = this.redisTemplate.opsForValue().get("TAGS_FILTER_RULE_V1_JSON"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        Map<String, Integer> densityRules = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        if (ruleStr != null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            Map<String, Map<String, Object>> ruleOrigin = JSONUtils.fromJson(ruleStr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    new TypeToken<Map<String, Map<String, Object>>>() {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    Collections.emptyMap()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            for (Map.Entry<String, Map<String, Object>> entry : ruleOrigin.entrySet()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                String k = entry.getKey(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                if (!entry.getValue().containsKey(appType)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                JSONObject jb = (JSONObject) entry.getValue().get(appType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                try{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    if (jb.containsKey("density") && jb.get("density") instanceof Integer){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        densityRules.put(k, jb.getInteger("density")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                }catch (Exception e){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    log.error("parse densityRules is wrong:", e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Map<String, Integer> densityRules = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (ruleStr != null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Map<String, Map<String, Object>> ruleOrigin = JSONUtils.fromJson(ruleStr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    new TypeToken<Map<String, Map<String, Object>>>() {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    Collections.emptyMap()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (Map.Entry<String, Map<String, Object>> entry : ruleOrigin.entrySet()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                String k = entry.getKey(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (!entry.getValue().containsKey(appType)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                JSONObject jb = (JSONObject) entry.getValue().get(appType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                try{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (jb.containsKey("density") && jb.get("density") instanceof Integer){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        densityRules.put(k, jb.getInteger("density")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }catch (Exception e){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    log.error("parse densityRules is wrong:", e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String abCode = param.getAbCode(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (this.filterRules != null && this.filterRules.containsKey(abCode)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Map<String, Map<String, String>> rule = this.filterRules.get(abCode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (Map.Entry<String, Map<String, String>> entry : rule.entrySet()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String key = entry.getKey(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Map<String, String> value = entry.getValue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (value.containsKey("density")){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    densityRules.put(key, Integer.valueOf(value.get("density"))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 2 读取video的tags 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 2 读取video的tags------------------ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         List<Long> videoIds = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for (Video v : rovRecallRank) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             videoIds.add(v.getVideoId()); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -88,9 +91,14 @@ public class RankStrategy4Density extends RankService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for (Video v : flowPoolRank) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             v.setTags(videoTagDict.getOrDefault(v.getVideoId(), new ArrayList<>())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // ------------------读取video的tags完成--------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 3 读取过滤规则,根据tag和过滤规则进行过滤------------------ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (this.filterRules != null && this.filterRules.containsKey(abCode)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Map<String, Map<String, String>> rule = this.filterRules.get(abCode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            RankProcessorTagFilter.tagFitlter(rovRecallRank, flowPoolRank, rule); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 4 流量池按比例强插--------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         List<Video> result = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for (int i = 0; i < param.getTopK() && i < rovRecallRank.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             result.add(rovRecallRank.get(i)); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -128,7 +136,7 @@ public class RankStrategy4Density extends RankService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 3 进行密度控制 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 3 进行密度控制------------------ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Set<Long> videosSet = result.stream().map(r-> r.getVideoId()).collect(Collectors.toSet()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         List<Video> rovRecallRankNew = rovRecallRank.stream().filter(r -> !videosSet.contains(r.getVideoId())).collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         List<Video> flowPoolRankNew = flowPoolRank.stream().filter(r -> !videosSet.contains(r.getVideoId())).collect(Collectors.toList()); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -137,6 +145,8 @@ public class RankStrategy4Density extends RankService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return new RankResult(resultWithDnsity); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //    public Video getTestVideo(Long id, String s){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //        Video a1 = new Video(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //        a1.setVideoId(id); 
			 |