package com.yeshi.buwan.service.manager.search;
|
|
import com.yeshi.buwan.domain.video.InternetSearchVideo;
|
import com.yeshi.buwan.dto.search.SolrResultDTO;
|
import com.yeshi.buwan.dto.search.SolrVideoSearchFilter;
|
import com.yeshi.buwan.service.inter.juhe.InternetSearchVideoService;
|
import com.yeshi.buwan.util.StringUtil;
|
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.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* 搜索引擎-全网搜数据管理
|
*/
|
@Component
|
public class SolrInternetSearchVideoDataManager {
|
|
private final String CORE_NAME = "buwan_internet_search";
|
|
private final Logger logger = LoggerFactory.getLogger(SolrInternetSearchVideoDataManager.class);
|
|
@Resource
|
private SolrTemplate solrTemplate;
|
|
@Resource
|
private InternetSearchVideoService internetSearchVideoService;
|
|
|
public void saveOrUpdate(InternetSearchVideo videoInfo) {
|
if (videoInfo == null)
|
return;
|
videoInfo.setSolrTime(new Date());
|
UpdateResponse updateResponse = solrTemplate.saveBean(CORE_NAME, videoInfo);
|
if (updateResponse.getStatus() == 0) {
|
solrTemplate.commit(CORE_NAME);
|
} else {
|
solrTemplate.rollback(CORE_NAME);
|
}
|
}
|
|
public void saveOrUpdate(List<InternetSearchVideo> videoInfoList) {
|
for (InternetSearchVideo video : videoInfoList) {
|
video.setSolrTime(new Date());
|
}
|
UpdateResponse updateResponse = solrTemplate.saveBeans(CORE_NAME, videoInfoList);
|
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 InternetSearchVideo findOne(String id) {
|
InternetSearchVideo solrVideo = solrTemplate.getById(CORE_NAME, id, InternetSearchVideo.class);
|
return solrVideo;
|
}
|
|
public SolrResultDTO find(SolrVideoSearchFilter filter, int page, int pageSize) {
|
if (filter.getKey() == null) {
|
filter.setKey("");
|
}
|
logger.info(filter.getKey() + "#" + page);
|
String key = filter.getKey();//.replace(" ", "\\ ");
|
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("nameStr").startsWith(key).or("actors").expression("\"" + key + "\""));
|
} catch (InvalidDataAccessApiUsageException e) {
|
query = new SimpleQuery(new Criteria("name").expression("\"" + key + "\""));
|
}
|
}
|
|
} else if (!StringUtil.isNullOrEmpty(filter.getActor())) {
|
query = new SimpleQuery(new Criteria("actors").expression("\"" + filter.getActor() + "\""));
|
} else if (!StringUtil.isNullOrEmpty(filter.getDirector())) {
|
query = new SimpleQuery(new Criteria("director").expression("\"" + filter.getDirector() + "\""));
|
} else {
|
query = new SimpleQuery("*:*");
|
}
|
|
|
if (filter.getVideoType() != null) {
|
query.addFilterQuery(new SimpleFilterQuery(Criteria.where("rootType").is(filter.getVideoType())));
|
}
|
|
if (filter.getResourceIds() != null && filter.getResourceIds().size() > 0) {
|
Criteria ors = null;
|
for (String rid : filter.getResourceIds()) {
|
if (ors == null)
|
ors = Criteria.where("resourceIds").contains(rid);
|
else
|
ors = ors.or("resourceIds").contains(rid);
|
}
|
query.addFilterQuery(new SimpleFilterQuery(ors));
|
}
|
|
|
if (filter.getArea() != null) {
|
query.addFilterQuery(new SimpleFilterQuery(Criteria.where("area").contains(filter.getArea())));
|
}
|
|
|
/** 设置分页开始记录数(第一页) 默认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<InternetSearchVideo> result = solrTemplate.queryForPage(CORE_NAME, query, InternetSearchVideo.class);
|
System.out.println("总记录数:" + result.getTotalElements());
|
List<InternetSearchVideo> list = result.getContent();
|
return new SolrResultDTO(list, (int) result.getTotalElements());
|
}
|
|
public List<String> getSuggestKeyList(String key) {
|
Query query = new SimpleQuery(new Criteria("nameStr").expression(key + "*"));
|
/** 设置分页开始记录数(第一页) 默认0 */
|
query.setOffset(0);
|
/** 设置每页显示记录数,默认10 */
|
query.setRows(10);
|
|
|
ScoredPage<InternetSearchVideo> result = solrTemplate.queryForPage(CORE_NAME, query, InternetSearchVideo.class);
|
System.out.println("总记录数:" + result.getTotalElements());
|
List<InternetSearchVideo> list = result.getContent();
|
List<String> keyList = new ArrayList<>();
|
for (InternetSearchVideo sv : list)
|
if (!keyList.contains(sv.getName()))
|
keyList.add(sv.getName());
|
return keyList;
|
}
|
|
|
/**
|
* 同步所有专辑
|
*/
|
public void syncAllAlbum() {
|
long count = internetSearchVideoService.countAll();
|
int pageSize = 100;
|
int pageCount = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
|
for (int i = 0; i < pageCount; i++) {
|
try {
|
List<InternetSearchVideo> videoList = internetSearchVideoService.listAll(i + 1, pageSize);
|
saveOrUpdate(videoList);
|
} catch (Exception e) {
|
logger.error("专辑搜索引擎数据同步失败", e);
|
}
|
}
|
}
|
|
public void syncAlbum(String videoId) {
|
InternetSearchVideo video = internetSearchVideoService.selectByPrimaryKey(videoId);
|
if (video == null)
|
return;
|
saveOrUpdate(video);
|
}
|
|
}
|