|
@ -0,0 +1,125 @@
|
|
|
package com.yihu.ehr.resource.service;
|
|
|
|
|
|
import com.yihu.ehr.query.BaseJpaService;
|
|
|
import com.yihu.ehr.resource.dao.HotWordDao;
|
|
|
import com.yihu.ehr.resource.model.HotWord;
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.data.redis.core.ZSetOperations;
|
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
@Service
|
|
|
@Transactional
|
|
|
public class ProfileSearchService extends BaseJpaService<HotWord,HotWordDao> {
|
|
|
|
|
|
private static final String PrefixRedis = "HOTWORDS_";
|
|
|
|
|
|
@Autowired
|
|
|
private RedisTemplate redisTemplate;
|
|
|
@Autowired
|
|
|
private JdbcTemplate jdbcTemplate;
|
|
|
|
|
|
public boolean saveOrUpdateHotWords(String searchText,int type){
|
|
|
boolean b = false;
|
|
|
if(StringUtils.isNotBlank(searchText)){
|
|
|
List<String> searchKeyWords = getSearchKeyWords(searchText);
|
|
|
b = saveOrUpdateToRedis(searchKeyWords,type);
|
|
|
}
|
|
|
return b;
|
|
|
}
|
|
|
|
|
|
public List<String> getHotWords(int type,int recount){
|
|
|
List<String> result = new ArrayList<>();
|
|
|
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
|
|
|
Set<String> values = zSetOperations.reverseRangeByScore(PrefixRedis+type, 0, Double.MAX_VALUE);
|
|
|
if(recount <= 0){
|
|
|
return result;
|
|
|
}
|
|
|
if(values.size() > 0){
|
|
|
for(String value:values){
|
|
|
result.add(value);
|
|
|
if(result.size() == recount){
|
|
|
return result;
|
|
|
}
|
|
|
}
|
|
|
}else{
|
|
|
//查看数据库是否有值,防止redis数据丢失
|
|
|
List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from hot_word where type=" + type + " order by search_count desc");
|
|
|
if(CollectionUtils.isNotEmpty(list)){
|
|
|
//不为空,将数据同步到redis,并返回数据
|
|
|
for(Map<String,Object> map:list){
|
|
|
zSetOperations.incrementScore(PrefixRedis+type, map.get("word"), Double.valueOf(map.get("search_count")+""));
|
|
|
if(result.size() < recount){
|
|
|
result.add(map.get("word")+"");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
private List<String> getSearchKeyWords(String keys){
|
|
|
List<String> list = new ArrayList<>();
|
|
|
if(StringUtils.isNotBlank(keys)){
|
|
|
String[] keyArray = keys.split(" ");
|
|
|
for(String key:keyArray){
|
|
|
if(StringUtils.isNotBlank(key) && !"or".equalsIgnoreCase(key) && !"and".equalsIgnoreCase(key)){
|
|
|
if(key.startsWith("\"") && key.endsWith("\"")){
|
|
|
key = key.substring(1,key.length()-1);
|
|
|
}else if(key.startsWith("+") || key.startsWith("-")){
|
|
|
key = key.substring(1);
|
|
|
}
|
|
|
list.add(key);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
*
|
|
|
* @param keys 搜索词
|
|
|
* @param type 1:病历(目前只有该分类,用于后期做扩展)
|
|
|
* @return
|
|
|
*/
|
|
|
public boolean saveOrUpdateToRedis(List<String> keys,int type){
|
|
|
if(CollectionUtils.isNotEmpty(keys)){
|
|
|
keys.forEach(key ->{
|
|
|
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
|
|
|
zSetOperations.incrementScore(PrefixRedis+type, key, 1);
|
|
|
});
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
public boolean synRedisHotWords(int type){
|
|
|
//1.获取redis中的热搜
|
|
|
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
|
|
|
Set<ZSetOperations.TypedTuple<String>> values = zSetOperations.rangeByScoreWithScores(PrefixRedis+type, 0, Double.MAX_VALUE);
|
|
|
Date now = new Date();
|
|
|
if(!values.isEmpty()){
|
|
|
//2.清空mysql的热搜
|
|
|
jdbcTemplate.execute("delete from hot_word where type ="+type);
|
|
|
List<HotWord> insertList = new ArrayList<>();
|
|
|
for(ZSetOperations.TypedTuple value:values){
|
|
|
HotWord hotWord = new HotWord();
|
|
|
hotWord.setWord(value.getValue().toString());
|
|
|
hotWord.setSearchCount((int)value.getScore().doubleValue());
|
|
|
hotWord.setExpireTime(-1);
|
|
|
hotWord.setType(type);
|
|
|
hotWord.setUpdateTime(now);
|
|
|
insertList.add(hotWord);
|
|
|
}
|
|
|
batchInsert(insertList);
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
}
|