| | |
| | | package com.yeshi.buwan.service.manager; |
| | | |
| | | import com.yeshi.buwan.domain.ResourceVideo; |
| | | import com.yeshi.buwan.domain.SolrVideo; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.VideoResource; |
| | | import com.yeshi.buwan.domain.video.AlbumVideoMap; |
| | | import com.yeshi.buwan.dto.search.SolrResultDTO; |
| | | import com.yeshi.buwan.dto.search.SolrVideoSearchFilter; |
| | | import com.yeshi.buwan.service.imp.ResourceVideoService; |
| | | import com.yeshi.buwan.service.imp.VideoInfoService; |
| | | import com.yeshi.buwan.service.inter.juhe.AlbumVideoMapService; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import com.yeshi.buwan.util.factory.SolrVideoFactory; |
| | | import org.apache.solr.client.solrj.response.UpdateResponse; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.data.domain.Sort; |
| | | import org.springframework.data.solr.core.SolrTemplate; |
| | | import org.springframework.data.solr.core.query.Criteria; |
| | |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * 搜索引擎-专辑数据管理 |
| | | */ |
| | | @Component |
| | | public class SolrAlbumDataManager { |
| | | |
| | | private final static String CORE_NAME = "buwan_album"; |
| | | |
| | | private final Logger logger = LoggerFactory.getLogger(SolrAlbumDataManager.class); |
| | | |
| | | @Resource |
| | | private SolrTemplate solrTemplate; |
| | |
| | | @Resource |
| | | private VideoInfoService videoInfoService; |
| | | |
| | | @Resource |
| | | private ResourceVideoService resourceVideoService; |
| | | |
| | | |
| | | public void saveOrUpdate(VideoInfo videoInfo) { |
| | | UpdateResponse updateResponse = solrTemplate.saveBean(SolrVideoFactory.create(videoInfo)); |
| | | UpdateResponse updateResponse = solrTemplate.saveBean(CORE_NAME, SolrVideoFactory.create(videoInfo, videoInfo.getResourceList())); |
| | | if (updateResponse.getStatus() == 0) { |
| | | solrTemplate.commit(); |
| | | solrTemplate.commit(CORE_NAME); |
| | | } else { |
| | | solrTemplate.rollback(); |
| | | solrTemplate.rollback(CORE_NAME); |
| | | } |
| | | } |
| | | |
| | | public void saveOrUpdate(List<VideoInfo> videoInfoList) { |
| | | List<SolrVideo> solrVideoList = new ArrayList<>(); |
| | | for (VideoInfo vi : videoInfoList) { |
| | | solrVideoList.add(SolrVideoFactory.create(vi)); |
| | | solrVideoList.add(SolrVideoFactory.create(vi, vi.getResourceList())); |
| | | } |
| | | UpdateResponse updateResponse = solrTemplate.saveBeans(solrVideoList); |
| | | UpdateResponse updateResponse = solrTemplate.saveBeans(CORE_NAME, solrVideoList); |
| | | if (updateResponse.getStatus() == 0) { |
| | | solrTemplate.commit(); |
| | | solrTemplate.commit(CORE_NAME); |
| | | } else { |
| | | solrTemplate.rollback(); |
| | | solrTemplate.rollback(CORE_NAME); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 删除所有 |
| | | */ |
| | | // public void clear() { |
| | | // Query query = new SimpleQuery("name:*"); |
| | | // UpdateResponse updateResponse = solrTemplate.delete(query); |
| | | // if (updateResponse.getStatus() == 0) { |
| | | // solrTemplate.commit(); |
| | | // } else { |
| | | // solrTemplate.rollback(); |
| | | // } |
| | | // } |
| | | public void deleteById(String id) { |
| | | UpdateResponse updateResponse = solrTemplate.deleteById(id); |
| | | UpdateResponse updateResponse = solrTemplate.deleteByIds(CORE_NAME, id); |
| | | if (updateResponse.getStatus() == 0) { |
| | | solrTemplate.commit(); |
| | | solrTemplate.commit(CORE_NAME); |
| | | } else { |
| | | solrTemplate.rollback(); |
| | | solrTemplate.rollback(CORE_NAME); |
| | | } |
| | | } |
| | | |
| | | public SolrVideo findOne(String id) { |
| | | SolrVideo solrVideo = solrTemplate.getById(id, SolrVideo.class); |
| | | return solrVideo; |
| | | Optional<SolrVideo> solrVideo = solrTemplate.getById(CORE_NAME, id, SolrVideo.class); |
| | | return solrVideo.get(); |
| | | } |
| | | |
| | | public SolrResultDTO findByKey(String key, Integer contentType, Integer videoType, int page, int pageSize) { |
| | | Query query = new SimpleQuery("name:\"" + key + "\""); |
| | | public SolrResultDTO find(SolrVideoSearchFilter filter, int page, int pageSize) { |
| | | if (filter.getKey() == null) { |
| | | filter.setKey(""); |
| | | } |
| | | logger.info(filter.getKey() + "#" + page); |
| | | Query query = null; |
| | | if (!StringUtil.isNullOrEmpty(filter.getKey())) { |
| | | //solr精准检索需要带引号 |
| | | query = new SimpleQuery("name:\"" + filter.getKey() + "\""); |
| | | } else { |
| | | query = new SimpleQuery(); |
| | | } |
| | | Criteria criteria = new Criteria("contenttype").is(filter.getContentType()); |
| | | |
| | | Criteria criteria = new Criteria("contenttype").is(contentType); |
| | | if (filter.getVideoType() != null) { |
| | | criteria = criteria.and("root_video_type").is(filter.getVideoType()); |
| | | } |
| | | |
| | | if (videoType != null) |
| | | criteria = criteria.and("root_video_type").is(videoType); |
| | | if (filter.getActor() != null) { |
| | | criteria = criteria.and("mainactor").expression("\"" + filter.getActor() + "\""); |
| | | } |
| | | |
| | | if (filter.getDirector() != null) { |
| | | criteria = criteria.and("director").expression("\"" + filter.getDirector() + "\""); |
| | | } |
| | | |
| | | if (filter.getResourceIds() != null && filter.getResourceIds().length > 0) { |
| | | criteria = criteria.and("resourceIds").contains(filter.getResourceIds()); |
| | | } |
| | | |
| | | |
| | | /** 添加条件 */ |
| | | if (criteria != null) |
| | | query.addCriteria(criteria); |
| | | |
| | | /** 设置分页开始记录数(第一页) 默认0 */ |
| | | query.setOffset((page - 1) * pageSize); |
| | | query.setOffset((page - 1) * pageSize * 1L); |
| | | /** 设置每页显示记录数,默认10 */ |
| | | query.setRows(pageSize); |
| | | query.addSort(new Sort(Sort.Direction.DESC, "year")); |
| | | ScoredPage<SolrVideo> result = solrTemplate.queryForPage(query, SolrVideo.class); |
| | | if (StringUtil.isNullOrEmpty(filter.getSortKey())) { |
| | | query.addSort(new Sort(Sort.Direction.DESC, "year")); |
| | | } else { |
| | | query.addSort(new Sort(Sort.Direction.DESC, filter.getSortKey())); |
| | | } |
| | | ScoredPage<SolrVideo> result = solrTemplate.queryForPage(CORE_NAME, query, SolrVideo.class); |
| | | System.out.println("总记录数:" + result.getTotalElements()); |
| | | List<SolrVideo> list = result.getContent(); |
| | | return new SolrResultDTO(list, (int) result.getTotalElements()); |
| | |
| | | public List<String> getSuggestKeyList(String key) { |
| | | Query query = new SimpleQuery("name:\"" + key + "\""); |
| | | /** 设置分页开始记录数(第一页) 默认0 */ |
| | | query.setOffset(0); |
| | | query.setOffset(0L); |
| | | /** 设置每页显示记录数,默认10 */ |
| | | query.setRows(10); |
| | | ScoredPage<SolrVideo> result = solrTemplate.queryForPage(query, SolrVideo.class); |
| | | ScoredPage<SolrVideo> result = solrTemplate.queryForPage(CORE_NAME, query, SolrVideo.class); |
| | | System.out.println("总记录数:" + result.getTotalElements()); |
| | | List<SolrVideo> list = result.getContent(); |
| | | List<String> keyList = new ArrayList<>(); |
| | |
| | | long count = albumVideoMapService.countAll(); |
| | | int pageSize = 100; |
| | | int pageCount = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1); |
| | | for (int i = 3; i < pageCount; i++) { |
| | | List<String> videoIds = new ArrayList<>(); |
| | | List<AlbumVideoMap> albumVideoMapList = albumVideoMapService.listAll(i + 1, pageSize); |
| | | for (AlbumVideoMap map : albumVideoMapList) { |
| | | videoIds.add(map.getVideoId()); |
| | | for (int i = 0; i < pageCount; i++) { |
| | | try { |
| | | List<String> videoIds = new ArrayList<>(); |
| | | List<AlbumVideoMap> albumVideoMapList = albumVideoMapService.listAll(i + 1, pageSize); |
| | | for (AlbumVideoMap map : albumVideoMapList) { |
| | | videoIds.add(map.getVideoId()); |
| | | } |
| | | List<VideoInfo> videoList = videoInfoService.listByVideoIds(videoIds); |
| | | |
| | | //获取资源ID |
| | | List<ResourceVideo> rvList = resourceVideoService.getResourceList(videoList); |
| | | Map<String, List<VideoResource>> map = new HashMap<>(); |
| | | for (ResourceVideo rv : rvList) { |
| | | if (rv.getVideo() != null && rv.getResource() != null) { |
| | | if (map.get(rv.getVideo().getId()) == null) |
| | | map.put(rv.getVideo().getId(), new ArrayList<>()); |
| | | map.get(rv.getVideo().getId()).add(rv.getResource()); |
| | | } |
| | | } |
| | | for (VideoInfo vi : videoList) { |
| | | if (map.get(vi.getId()) != null) { |
| | | vi.setResourceList(map.get(vi.getId())); |
| | | } |
| | | } |
| | | |
| | | saveOrUpdate(videoList); |
| | | } catch (Exception e) { |
| | | logger.error("专辑搜索引擎数据同步失败"); |
| | | } |
| | | List<VideoInfo> videoList = videoInfoService.listByVideoIds(videoIds); |
| | | saveOrUpdate(videoList); |
| | | } |
| | | } |
| | | |
| | |
| | | AlbumVideoMap map = albumVideoMapService.selectByVideoId(videoId); |
| | | if (map == null) |
| | | return; |
| | | |
| | | List<VideoInfo> videoList = new ArrayList<>(); |
| | | VideoInfo video = videoInfoService.getVideoInfo(videoId); |
| | | if (video != null) |
| | | videoList.add(video); |
| | | saveOrUpdate(videoList); |
| | | if (video != null) { |
| | | List<ResourceVideo> rvList = resourceVideoService.getResourceList(video.getId()); |
| | | List<VideoResource> vrList = new ArrayList<>(); |
| | | for (ResourceVideo rv : rvList) |
| | | vrList.add(rv.getResource()); |
| | | video.setResourceList(vrList); |
| | | saveOrUpdate(video); |
| | | } |
| | | } |
| | | |
| | | } |