| | |
| | | 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; |
| | |
| | | |
| | | @Service |
| | | public class SearchService { |
| | | private Logger logger = LoggerFactory.getLogger(SearchService.class); |
| | | |
| | | private final String ALBUM_SEARCH_FUZZY_KEYS = "《,》,。"; |
| | | |
| | | |
| | | @Resource |
| | | private SearchDao searchDao; |
| | | @Resource |
| | |
| | | private DetailSystemDao detailSystemDao; |
| | | @Resource |
| | | private SolrAlbumVideoDataManager solrAlbumDataManager; |
| | | |
| | | @Resource |
| | | private SolrInternetSearchVideoDataManager solrInternetSearchVideoDataManager; |
| | | |
| | | @Resource |
| | | private VideoInfoExtraService videoInfoExtraService; |
| | |
| | | } |
| | | |
| | | |
| | | @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); |
| | | //删除前面有的数据,根据rootType与名称筛选 |
| | | 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"; |
| | |
| | | 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); |
| | | // 查询数据库 |
| | |
| | | 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) { |
| | | //搜索原始的 |
| | | List<VideoInfo> solrList = SolrUtil.search(key, commonSolrPage); |
| | | for (VideoInfo vi : solrList) { |
| | | if (!solrAlbumVids.contains(vi.getId())) { |
| | | localList.add(vi); |
| | | try { |
| | | List<VideoInfo> solrList = SolrUtil.search(key, commonSolrPage); |
| | | for (VideoInfo vi : solrList) { |
| | | if (!solrAlbumVids.contains(vi.getId())) { |
| | | localList.add(vi); |
| | | } |
| | | } |
| | | } 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); |
| | | } |
| | | |
| | | //获取附加信息 |
| | |
| | | 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; |
| | | } |
| | | } |
| | | |
| | | } |