package com.yeshi.buwan.service.manager;
|
|
import com.yeshi.buwan.dao.VideoInfoDao;
|
import com.yeshi.buwan.domain.*;
|
import com.yeshi.buwan.domain.solr.SolrCommonVideo;
|
import com.yeshi.buwan.domain.solr.SolrCommonVideo;
|
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.CategoryVideoService;
|
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.data.solr.core.query.Query;
|
import org.springframework.data.solr.core.query.SimpleQuery;
|
import org.springframework.data.solr.core.query.result.ScoredPage;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.Resource;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* 搜索引擎-专辑数据管理
|
*/
|
@Component
|
public class SolrCommonVideoDataManager {
|
|
private final String CORE_NAME = "buwan_video";
|
|
private final Logger logger = LoggerFactory.getLogger(SolrCommonVideoDataManager.class);
|
|
@Resource
|
private SolrTemplate solrTemplate;
|
|
@Resource
|
private AlbumVideoMapService albumVideoMapService;
|
|
@Resource
|
private VideoInfoService videoInfoService;
|
|
@Resource
|
private ResourceVideoService resourceVideoService;
|
|
@Resource
|
private CategoryVideoService categoryVideoService;
|
|
|
public void saveOrUpdate(VideoInfo videoInfo) {
|
UpdateResponse updateResponse = solrTemplate.saveBean(CORE_NAME, SolrVideoFactory.createAlbum(videoInfo, videoInfo.getResourceList()));
|
if (updateResponse.getStatus() == 0) {
|
solrTemplate.commit(CORE_NAME);
|
} else {
|
solrTemplate.rollback(CORE_NAME);
|
}
|
}
|
|
/**
|
* 保存到搜索文档
|
*
|
* @param videoInfoList
|
*/
|
public void saveOrUpdate(List<VideoInfo> videoInfoList) {
|
List<SolrCommonVideo> solrVideoList = new ArrayList<>();
|
for (VideoInfo vi : videoInfoList) {
|
solrVideoList.add(SolrVideoFactory.createCommon(vi, vi.getTypeList(), vi.getResourceList()));
|
}
|
UpdateResponse updateResponse = solrTemplate.saveBeans(CORE_NAME, solrVideoList);
|
if (updateResponse.getStatus() == 0) {
|
solrTemplate.commit(CORE_NAME);
|
} else {
|
solrTemplate.rollback(CORE_NAME);
|
}
|
}
|
|
public void deleteById(String id) {
|
UpdateResponse updateResponse = solrTemplate.deleteById(CORE_NAME, id);
|
if (updateResponse.getStatus() == 0) {
|
solrTemplate.commit(CORE_NAME);
|
} else {
|
solrTemplate.rollback(CORE_NAME);
|
}
|
}
|
|
public SolrCommonVideo findOne(String id) {
|
SolrCommonVideo solrVideo = solrTemplate.getById(CORE_NAME, id, SolrCommonVideo.class);
|
return solrVideo;
|
}
|
|
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());
|
|
if (filter.getVideoType() != null) {
|
criteria = criteria.and("root_video_type").is(filter.getVideoType());
|
}
|
|
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().size() > 0) {
|
criteria = criteria.and("resourceIds").contains(filter.getResourceIds());
|
}
|
|
|
/** 添加条件 */
|
if (criteria != null)
|
query.addCriteria(criteria);
|
|
/** 设置分页开始记录数(第一页) 默认0 */
|
query.setOffset((page - 1) * pageSize);
|
/** 设置每页显示记录数,默认10 */
|
query.setRows(pageSize);
|
if (StringUtil.isNullOrEmpty(filter.getSortKey())) {
|
query.addSort(new Sort(Sort.Direction.DESC, "year"));
|
} else {
|
query.addSort(new Sort(Sort.Direction.DESC, filter.getSortKey()));
|
}
|
ScoredPage<SolrCommonVideo> result = solrTemplate.queryForPage(CORE_NAME, query, SolrCommonVideo.class);
|
System.out.println("总记录数:" + result.getTotalElements());
|
List<SolrCommonVideo> 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);
|
/** 设置每页显示记录数,默认10 */
|
query.setRows(10);
|
ScoredPage<SolrCommonVideo> result = solrTemplate.queryForPage(CORE_NAME, query, SolrCommonVideo.class);
|
System.out.println("总记录数:" + result.getTotalElements());
|
List<SolrCommonVideo> list = result.getContent();
|
List<String> keyList = new ArrayList<>();
|
for (SolrCommonVideo sv : list)
|
if (!keyList.contains(sv.getName()))
|
keyList.add(sv.getName());
|
return keyList;
|
}
|
|
|
/**
|
* 同步所有专辑
|
*/
|
public void syncAllVideo(Long minId) {
|
VideoInfoDao.DaoQuery query = new VideoInfoDao.DaoQuery();
|
query.show = 1 + "";
|
query.minId=minId;
|
|
long count = videoInfoService.count(query);
|
int pageSize = 100;
|
int pageCount = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
|
for (int i = 0; i < pageCount; i++) {
|
//查询第一个数据
|
query.start = i * pageSize;
|
query.minId = null;
|
query.count = 1;
|
List<VideoInfo> list = videoInfoService.list(query);
|
if (list == null || list.size() == 0)
|
continue;
|
|
query.minId = Long.parseLong(list.get(0).getId());
|
query.count = pageSize;
|
list = videoInfoService.list(query);
|
if (list == null || list.size() == 0)
|
continue;
|
|
//拉取分类
|
List<CategoryVideo> categoryVideoList = categoryVideoService.getCategoryList(list);
|
Map<String, List<VideoType>> typeMap = new HashMap<>();
|
for (CategoryVideo cv : categoryVideoList) {
|
if (cv == null || cv.getVideo() == null || cv.getVideoType() == null)
|
continue;
|
if (typeMap.get(cv.getVideo().getId()) == null)
|
typeMap.put(cv.getVideo().getId(), new ArrayList<>());
|
typeMap.get(cv.getVideo().getId()).add(cv.getVideoType());
|
}
|
for (VideoInfo videoInfo : list) {
|
videoInfo.setTypeList(typeMap.get(videoInfo.getId()));
|
}
|
|
|
//拉取资源
|
List<ResourceVideo> rvList = resourceVideoService.getResourceList(list);
|
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 : list) {
|
if (map.get(vi.getId()) != null) {
|
vi.setResourceList(map.get(vi.getId()));
|
}
|
}
|
|
try {
|
saveOrUpdate(list);
|
} catch (Exception e) {
|
logger.error("一般视频搜索引擎数据同步失败",e);
|
}
|
}
|
}
|
|
// public void syncAlbum(String videoId) {
|
// AlbumVideoMap map = albumVideoMapService.selectByVideoId(videoId);
|
// if (map == null)
|
// return;
|
// VideoInfo video = videoInfoService.getVideoInfo(videoId);
|
// 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);
|
// }
|
// }
|
|
}
|