package com.yeshi.buwan.service.manager.search;
|
|
import com.yeshi.buwan.domain.VideoResource;
|
import com.yeshi.buwan.domain.entity.PlayUrl;
|
import com.yeshi.buwan.domain.solr.SolrShortVideo;
|
import com.yeshi.buwan.dto.search.SolrResultDTO;
|
import com.yeshi.buwan.dto.search.SolrShortVideoSearchFilter;
|
import com.yeshi.buwan.iqiyi.util.IqiyiUtil;
|
import com.yeshi.buwan.util.StringUtil;
|
import com.yeshi.buwan.util.video.shortvideo.ShortVideoUtil;
|
import org.apache.solr.client.solrj.response.UpdateResponse;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.dao.InvalidDataAccessApiUsageException;
|
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.SimpleFilterQuery;
|
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.List;
|
|
/**
|
* 搜索引擎-短视频数据管理
|
*/
|
@Component
|
public class SolrShortVideoDataManager {
|
|
private final String CORE_NAME = "buwan_short_video";
|
|
private final Logger logger = LoggerFactory.getLogger(SolrShortVideoDataManager.class);
|
|
@Resource
|
private SolrTemplate solrTemplate;
|
|
|
public void saveOrUpdate(SolrShortVideo solrShortVideo) {
|
if (solrShortVideo.getLocalUpdateTime() == null) {
|
solrShortVideo.setLocalUpdateTime(System.currentTimeMillis());
|
}
|
UpdateResponse updateResponse = solrTemplate.saveBean(CORE_NAME, solrShortVideo);
|
if (updateResponse.getStatus() == 0) {
|
solrTemplate.commit(CORE_NAME);
|
} else {
|
solrTemplate.rollback(CORE_NAME);
|
}
|
}
|
|
public void saveOrUpdate(List<SolrShortVideo> shortVideoList) {
|
UpdateResponse updateResponse = solrTemplate.saveBeans(CORE_NAME, shortVideoList);
|
if (updateResponse.getStatus() == 0) {
|
solrTemplate.commit(CORE_NAME);
|
} else {
|
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(CORE_NAME, id);
|
if (updateResponse.getStatus() == 0) {
|
solrTemplate.commit(CORE_NAME);
|
} else {
|
solrTemplate.rollback(CORE_NAME);
|
}
|
}
|
|
public SolrShortVideo findOne(String id) {
|
Query query = new SimpleQuery(new Criteria("id").is(id));
|
ScoredPage<SolrShortVideo> result = solrTemplate.queryForPage(CORE_NAME, query, SolrShortVideo.class);
|
if (result != null && result.getContent().size() > 0) {
|
return result.getContent().get(0);
|
}
|
return null;
|
}
|
|
public SolrResultDTO find(SolrShortVideoSearchFilter 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精准检索需要带引号
|
if (filter.isFuzzy()) {
|
query = new SimpleQuery(new Criteria("name").expression(filter.getKey()));
|
} else {
|
try {
|
query = new SimpleQuery(new Criteria("name_str").startsWith(filter.getKey()));
|
} catch (InvalidDataAccessApiUsageException e) {
|
query = new SimpleQuery(new Criteria("name_str").expression("\"" + filter.getKey() + "\""));
|
}
|
}
|
} else {
|
query = new SimpleQuery("*:*");
|
}
|
|
|
if (filter.getRootVideoType() != null) {
|
query.addFilterQuery(new SimpleFilterQuery(Criteria.where("root_video_type").is(filter.getRootVideoType())));
|
}
|
|
if (filter.getResourceIds() != null && filter.getResourceIds().size() > 0) {
|
Criteria criteria = null;
|
for (Integer resourceId : filter.getResourceIds()) {
|
if (criteria == null)
|
criteria = Criteria.where("resource_id").is(resourceId);
|
else
|
criteria = criteria.or("resource_id").is(resourceId);
|
}
|
query.addFilterQuery(new SimpleFilterQuery(criteria));
|
}
|
|
if (filter.getCategoryName() != null) {
|
query.addFilterQuery(new SimpleFilterQuery(Criteria.where("category_names").contains(filter.getCategoryName())));
|
}
|
|
//区域
|
if (filter.getAreas() != null && filter.getAreas().size() > 0) {
|
Criteria criteria = null;
|
for (String area : filter.getAreas()) {
|
if (criteria == null)
|
criteria = Criteria.where("area").is(area);
|
else
|
criteria = criteria.or("area").is(area);
|
}
|
query.addFilterQuery(new SimpleFilterQuery(criteria));
|
}
|
|
if (filter.getTag() != null) {
|
query.addFilterQuery(new SimpleFilterQuery(Criteria.where("tag").is(filter.getTag())));
|
}
|
|
|
/** 设置分页开始记录数(第一页) 默认0 */
|
query.setOffset((page - 1) * pageSize);
|
/** 设置每页显示记录数,默认10 */
|
query.setRows(pageSize);
|
if (!StringUtil.isNullOrEmpty(filter.getSortKey())) {
|
query.addSort(new Sort(Sort.Direction.DESC, filter.getSortKey()));
|
}
|
ScoredPage<SolrShortVideo> result = solrTemplate.queryForPage(CORE_NAME, query, SolrShortVideo.class);
|
System.out.println("总记录数:" + result.getTotalElements());
|
List<SolrShortVideo> list = result.getContent();
|
return new SolrResultDTO(list, (int) result.getTotalElements());
|
}
|
|
public PlayUrl getPlayUrl(String id, VideoResource videoResource) {
|
//短视频
|
if (ShortVideoUtil.isShortVideoId(id)) {
|
SolrShortVideo solrShortVideo = findOne(id);
|
if (solrShortVideo == null)
|
return null;
|
PlayUrl pu = new PlayUrl();
|
pu.setParams("");
|
pu.setPlayType(IqiyiUtil.PLAY_HTML);
|
pu.setResource(videoResource);
|
pu.setUrl(solrShortVideo.getPlayUrl());
|
return pu;
|
}
|
return null;
|
}
|
|
}
|