From f788607ff771a47bc60d6a86e00b3433c40f3d2c Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期五, 24 九月 2021 15:22:03 +0800 Subject: [PATCH] 接入视频直播 --- src/main/java/com/yeshi/buwan/service/imp/SearchService.java | 316 +++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 234 insertions(+), 82 deletions(-) diff --git a/src/main/java/com/yeshi/buwan/service/imp/SearchService.java b/src/main/java/com/yeshi/buwan/service/imp/SearchService.java index 69a83a7..011d7d2 100644 --- a/src/main/java/com/yeshi/buwan/service/imp/SearchService.java +++ b/src/main/java/com/yeshi/buwan/service/imp/SearchService.java @@ -5,18 +5,23 @@ import com.yeshi.buwan.domain.*; import com.yeshi.buwan.domain.solr.SolrAlbumVideo; import com.yeshi.buwan.domain.system.DetailSystem; +import com.yeshi.buwan.domain.video.InternetSearchVideo; import com.yeshi.buwan.domain.web.DetailSystemSelect; import com.yeshi.buwan.domain.web.HotSearchAdmin; import com.yeshi.buwan.dto.search.SolrResultDTO; import com.yeshi.buwan.dto.search.SolrVideoSearchFilter; +import com.yeshi.buwan.videos.pptv.PPTVUtil; import com.yeshi.buwan.service.inter.video.VideoInfoExtraService; -import com.yeshi.buwan.service.manager.SolrAlbumVideoDataManager; +import com.yeshi.buwan.service.manager.search.SolrAlbumVideoDataManager; +import com.yeshi.buwan.service.manager.search.SolrInternetSearchVideoDataManager; import com.yeshi.buwan.util.*; import com.yeshi.buwan.util.factory.VideoInfoFactory; import com.yeshi.buwan.util.video.VideoConstant; import com.yeshi.buwan.vo.video.VideoListResultVO; import org.hibernate.HibernateException; import org.hibernate.Session; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.cache.annotation.Cacheable; import org.springframework.orm.hibernate4.HibernateCallback; import org.springframework.stereotype.Service; @@ -28,6 +33,11 @@ @Service public class SearchService { + private Logger logger = LoggerFactory.getLogger(SearchService.class); + + private final String ALBUM_SEARCH_FUZZY_KEYS = "銆�,銆�,銆�"; + + @Resource private SearchDao searchDao; @Resource @@ -44,6 +54,9 @@ private DetailSystemDao detailSystemDao; @Resource private SolrAlbumVideoDataManager solrAlbumDataManager; + + @Resource + private SolrInternetSearchVideoDataManager solrInternetSearchVideoDataManager; @Resource private VideoInfoExtraService videoInfoExtraService; @@ -245,9 +258,142 @@ } - @Cacheable(value = "userCache", key = "'searchNew'+'-'+#detailSystem+'-'+#key+'-'+#page+'-'+#videoType+'-'+#system+'-'+#cacheMD5") - public VideoListResultVO searchNew(String detailSystem, String ip, String uid, String key, int page, int videoType, - String system, List<Long> resourceList, String cacheMD5) { + private VideoInfo loadAlbumData(VideoInfo video) { + video.setShowType(1); + if (!StringUtil.isNullOrEmpty(video.getMainActor())) { + video.setMainActor("涓绘紨锛�" + video.getMainActor()); + } + + //璁剧疆tag + String tag = ""; + if (!StringUtil.isNullOrEmpty(video.getYear())) { + tag += video.getYear() + "/"; + } + + if (video.getVideoType() != null) { + String vt = VideoConstant.getMainCategoryName(video.getVideoType().getId()); + if (!StringUtil.isNullOrEmpty(vt)) { + tag += vt + "/"; + } + } + + if (!StringUtil.isNullOrEmpty(video.getArea())) { + tag += video.getArea() + "/"; + } + + if (tag.endsWith("/")) + tag = tag.substring(0, tag.length() - 1); + video.setTag(tag); + + return video; + + } + + + public SearchResult searchAlbum(int videoType, String key, List<Long> resourceIds, int page, int pageSize, boolean fuzzy) { + List<VideoInfo> localList = new ArrayList<>(); + //涓撹緫瑙嗛闆嗗悎 + Set<String> solrAlbumVids = new HashSet<>(); + + SolrVideoSearchFilter filter = new SolrVideoSearchFilter(); + filter.setFuzzy(fuzzy); + filter.setKey(key); + if (videoType == Constant.SEARCH_RESULT_TYPE_HIGH_DEFINITION) { + filter.setResourceIds(Arrays.asList(new String[]{PPTVUtil.RESOURCE_ID + ""})); + logger.info("楂樻竻鎼滅储# key锛歿}", key); + } else { + List<String> rids = new ArrayList<>(); + for (Long rid : resourceIds) { + rids.add(rid + ""); + } + filter.setResourceIds(rids); + filter.setVideoType(videoType == 0 ? null : videoType); + } + filter.setContentType(1); + + SolrResultDTO solrResultDTO = solrAlbumDataManager.find(filter, page, pageSize); + Set<String> albumSet = new HashSet<>(); + int albumCount = 0; + if (solrResultDTO != null) { + albumCount = solrResultDTO.getTotalCount(); + for (SolrAlbumVideo sv : (List<SolrAlbumVideo>) solrResultDTO.getVideoList()) { + VideoInfo video = VideoInfoFactory.create(sv); + albumSet.add(video.getName() + "#" + video.getVideoType().getId() + "#" + video.getYear()); + video = loadAlbumData(video); + localList.add(video); + solrAlbumVids.add(video.getId()); + } + } + + //绗竴椤�,涓嶄负楂樻竻鏃舵悳绱� + if (page == 1 && videoType != Constant.SEARCH_RESULT_TYPE_HIGH_DEFINITION) { + //page涓�1鏃� 鍏ㄧ綉鎼� + SolrResultDTO internetSearchResultDTO = solrInternetSearchVideoDataManager.find(filter, 1, 20); + if (internetSearchResultDTO != null && internetSearchResultDTO.getVideoList().size() > 0) { + List<InternetSearchVideo> iList = internetSearchResultDTO.getVideoList(); + List<InternetSearchVideo> isvList = new ArrayList<>(); + if (iList != null && iList.size() > 0) + isvList.addAll(iList); + //鍒犻櫎鍓嶉潰鏈夌殑鏁版嵁锛屾牴鎹畆ootType涓庡悕绉扮瓫閫� + for (int i = 0; i < isvList.size(); i++) { + String uniqueId = isvList.get(i).getName() + "#" + isvList.get(i).getRootType() + "#" + isvList.get(i).getYear(); + if (albumSet.contains(uniqueId)) { + isvList.remove(i); + i--; + } + } + + //绮剧‘鍖归厤锛屼笉鍒嗚瘝 + if (!fuzzy) { + for (InternetSearchVideo sv : isvList) { + VideoInfo video = VideoInfoFactory.create(sv); + video = loadAlbumData(video); + //绗竴涓笓杈戞暟閲� + if (albumCount < 3) { + localList.add(video); + } else { + if (video.getName().equalsIgnoreCase(key)) + localList.add(video); + } + } + } else { + for (InternetSearchVideo sv : isvList) { + VideoInfo video = VideoInfoFactory.create(sv); + video = loadAlbumData(video); + localList.add(video); + } + } + } + //鎸夊叧閿瘝鐨勫尮閰嶅害鎺掑簭 + Comparator<VideoInfo> cm = (VideoInfo o1, VideoInfo o2) -> { + if (o1.getDefinition() - o2.getDefinition() == 0) { + float s1 = CompareStrSimUtil.getSimilarityRatio(o1.getName(), key, true); + float s2 = CompareStrSimUtil.getSimilarityRatio(o2.getName(), key, true); +// if (s1 != s2)//鐩镐技搴﹁秺楂樿秺闈犲墠 + try { + return s1 != s2 ? (s2 > s1 ? 1 : -1) : (Integer.parseInt(o2.getYear()) - Integer.parseInt(o1.getYear())); + } catch (Exception e) { + return s2 > s1 ? 1 : -1; + } +// else +// return o1.getDefinition() - o2.getDefinition();//楂樻竻鎺掑湪鍓� + } else { + return o2.getDefinition() - o1.getDefinition();//楂樻竻鎺掑湪鍓� + } + + }; + + Collections.sort(localList, cm); + } + //鏈悳绱㈠埌鍐呭 + if (localList == null || localList.size() == 0) { + logger.warn("涓撹緫鎼滅储鏃犵粨鏋�#{}", key); + } + return new SearchResult(albumCount, localList); + } + + private void filterSearchResult(List<VideoInfo> localList, List<Long> resourceList) { + String sql = ""; String resourceWhere = ""; for (Long re : resourceList) { resourceWhere += " rv.resourceid=" + re + " or"; @@ -256,15 +402,51 @@ if (resourceWhere.endsWith("or")) resourceWhere = resourceWhere.substring(0, resourceWhere.length() - 2); + + List<String> filterVideoIdList = new ArrayList<>(); + + for (int i = 0; i < localList.size(); i++) { + if (NumberUtil.isNumeric(localList.get(i).getId())) { + filterVideoIdList.add(localList.get(i).getId()); + sql += " select count(*) from wk_resource_video rv left join wk_video_video v on rv.videoid=v.id where v.id is not null and v.show=1 and rv.videoid=" + + localList.get(i).getId() + " and (" + resourceWhere + ") union all"; + } + } + + if (sql.endsWith("union all")) + sql = sql.substring(0, sql.length() - 9); + + List rlist = StringUtil.isNullOrEmpty(sql) ? new ArrayList() : videoInfoDao.sqlList(sql); + Set<String> deleteVids = new HashSet<>(); + for (int i = 0; i < filterVideoIdList.size(); i++) { + if (Integer.parseInt(rlist.get(i) + "") < 1) { + deleteVids.add(filterVideoIdList.get(i)); + } + } + + for (int i = 0; i < localList.size(); i++) { + if (deleteVids.contains(localList.get(i).getId())) { + localList.remove(i); + i--; + } + } + } + + + @Cacheable(value = "userCache", key = "'searchNew'+'-'+#detailSystem+'-'+#key+'-'+#page+'-'+#videoType+'-'+#system+'-'+#cacheMD5") + public VideoListResultVO searchNew(String detailSystem, String ip, String uid, String key, int page, int videoType, + String system, List<Long> resourceList, String cacheMD5) { SearchHistory sh = new SearchHistory(); sh.setCreatetime((new StringBuilder(String.valueOf(System.currentTimeMillis()))).toString()); sh.setIp(ip); if (!StringUtil.isNullOrEmpty(key) && key.length() > 30) key = key.substring(0, 30); sh.setKey(key); - UserInfo user = new UserInfo(); - user.setId(uid); - sh.setUser(user); + if (uid != null) { + UserInfo user = new UserInfo(); + user.setId(uid); + sh.setUser(user); + } searchDao.create(sh); // 鏌ヨ鏁版嵁搴� @@ -280,51 +462,23 @@ localList = new ArrayList<>(); //鍏堟悳绱笓杈� int pageSize = 20; - //涓撹緫瑙嗛闆嗗悎 - Set<String> solrAlbumVids = new HashSet<>(); + SearchResult searchResult = searchAlbum(videoType, key, resourceList, page, pageSize, false); - SolrVideoSearchFilter filter = new SolrVideoSearchFilter(); - filter.setKey(key); - filter.setVideoType(videoType == 0 ? null : videoType); - filter.setContentType(1); - - SolrResultDTO solrResultDTO = solrAlbumDataManager.find(filter, page, pageSize); - if (solrResultDTO != null) { - albumCount = solrResultDTO.getTotalCount(); - - for (SolrAlbumVideo sv : (List<SolrAlbumVideo>) solrResultDTO.getVideoList()) { - VideoInfo video = VideoInfoFactory.create(sv); - video.setShowType(1); - if (!StringUtil.isNullOrEmpty(video.getMainActor())) { - video.setMainActor("涓绘紨锛�" + video.getMainActor()); - } - - //璁剧疆tag - String tag = ""; - if (!StringUtil.isNullOrEmpty(sv.getYear())) { - tag += sv.getYear() + "/"; - } - - if (video.getVideoType() != null) { - String vt = VideoConstant.getMainCategoryName(sv.getRootVideoType()); - if (!StringUtil.isNullOrEmpty(vt)) { - tag += vt + "/"; - } - } - - if (!StringUtil.isNullOrEmpty(video.getArea())) { - tag += video.getArea() + "/"; - } - - if (tag.endsWith("/")) - tag = tag.substring(0, tag.length() - 1); - video.setTag(tag); - - localList.add(video); - solrAlbumVids.add(video.getId()); - } + if (page == 1 && (searchResult == null || searchResult.videoInfoList == null || searchResult.videoInfoList.size() == 0)) { + searchResult = searchAlbum(videoType, key, resourceList, page, pageSize, true); } - int commonSolrPage = page - solrResultDTO.getTotalCount() / pageSize; + + if (searchResult != null && searchResult.videoInfoList != null) { + localList.addAll(searchResult.videoInfoList); + } + + Set<String> solrAlbumVids = new HashSet<>(); + for (VideoInfo videoInfo : localList) { + solrAlbumVids.add(videoInfo.getId()); + } + + + int commonSolrPage = page - searchResult.getTotalCount() / pageSize; if (videoType == 0 && commonSolrPage > 0) { //鎼滅储鍘熷鐨� @@ -335,47 +489,18 @@ localList.add(vi); } } - }catch(Exception e){ + } catch (Exception e) { } } System.out.println("鎼滅储鑰楁椂:" + (System.currentTimeMillis() - startt)); - - String sql = ""; - startt = System.currentTimeMillis(); - for (int i = 0; i < localList.size(); i++) { - sql += " select count(*) from wk_resource_video rv left join wk_video_video v on rv.videoid=v.id where v.id is not null and v.show=1 and rv.videoid=" - + localList.get(i).getId() + " and (" + resourceWhere + ") union all"; - } - - if (sql.endsWith("union all")) - sql = sql.substring(0, sql.length() - 9); - - List rlist = StringUtil.isNullOrEmpty(sql) ? new ArrayList() : videoInfoDao.sqlList(sql); - List<Integer> pList = new ArrayList<>(); - for (int i = 0; i < localList.size(); i++) { - if (Integer.parseInt(rlist.get(i) + "") < 1) { - pList.add(i); - // localList.remove(i); - // i--; - } - } - - Collections.sort(pList); - for (int i = pList.size() - 1; i >= 0; i--) { - localList.remove((int) pList.get(i)); - } - - System.out.println("鎺掗櫎鑰楁椂:" + (System.currentTimeMillis() - startt)); - + filterSearchResult(localList, resourceList); } catch (Exception e) { e.printStackTrace(); } finally { } if (localList != null && localList.size() > 0) { - for (VideoInfo info : localList) { - list.add(info); - } + list.addAll(localList); } //鑾峰彇闄勫姞淇℃伅 @@ -639,4 +764,31 @@ return videoInfoList; } + + public static class SearchResult { + private int totalCount; + private List<VideoInfo> videoInfoList; + + public SearchResult(int totalCount, List<VideoInfo> videoInfoList) { + this.totalCount = totalCount; + this.videoInfoList = videoInfoList; + } + + public int getTotalCount() { + return totalCount; + } + + public void setTotalCount(int totalCount) { + this.totalCount = totalCount; + } + + public List<VideoInfo> getVideoInfoList() { + return videoInfoList; + } + + public void setVideoInfoList(List<VideoInfo> videoInfoList) { + this.videoInfoList = videoInfoList; + } + } + } -- Gitblit v1.8.0