SpringBoot+Redis 搞定搜索栏热搜、*敏*感*词*文字过滤功能
优采云 发布时间: 2022-04-30 20:18SpringBoot+Redis 搞定搜索栏热搜、*敏*感*词*文字过滤功能
来源:/qq_25838777/article/
details/109489767
使用java和redis实现一个简单的热搜功能,具备以下功能:
搜索栏展示当前登陆的个人用户的搜索历史记录,删除个人历史记录
用户在搜索栏输入某字符,则将该字符记录下来 以zset格式存储的redis中,记录该字符被搜索的个数以及当前的时间戳 (用了DFA算法,感兴趣的自己百度学习吧)
每当用户查询了已在redis存在了的字符时,则直接累加个数, 用来获取平台上最热查询的十条数据。(可以自己写接口或者直接在redis中添加一些预备好的关键词)
最后还要做*敏*感*词*文字过滤功能。这个很重要不说了你懂的。
代码实现热搜与个人搜索记录功能,主要controller层下几个方法就行了 :
向redis 添加热搜词汇(添加的时候使用下面*敏*感*词*文字过滤的方法来过滤下这个词汇,合法再去存储
每次点击给相关词热度 +1
根据key搜索相关最热的前十名
插入个人搜索记录
查询个人搜索记录
首先配置好redis数据源等等基础
最后贴上核心的 服务层的代码 :
<p>package com.****.****.****.user;<br /> <br />import com.jianlet.service.user.RedisService;<br />import org.apache.commons.lang.StringUtils;<br />import org.springframework.data.redis.core.*;<br />import org.springframework.stereotype.Service;<br />import javax.annotation.Resource;<br />import java.util.*;<br />import java.util.concurrent.TimeUnit;<br /> <br />/**<br /> * @author: mrwanghc<br /> * @date: 2020/5/13<br /> * @description:<br /> */<br />@Transactional<br />@Service("redisService")<br />public class RedisServiceImpl implements RedisService {<br /> <br /> //导入数据源<br /> @Resource(name = "redisSearchTemplate")<br /> private StringRedisTemplate redisSearchTemplate;<br /> <br /> <br /> //新增一条该userid用户在搜索栏的历史记录<br /> //searchkey 代表输入的关键词<br /> @Override<br /> public int addSearchHistoryByUserId(String userid, String searchkey) {<br /> String shistory = RedisKeyUtils.getSearchHistoryKey(userid);<br /> boolean b = redisSearchTemplate.hasKey(shistory);<br /> if (b) {<br /> Object hk = redisSearchTemplate.opsForHash().get(shistory, searchkey);<br /> if (hk != null) {<br /> return 1;<br /> }else{<br /> redisSearchTemplate.opsForHash().put(shistory, searchkey, "1");<br /> }<br /> }else{<br /> redisSearchTemplate.opsForHash().put(shistory, searchkey, "1");<br /> }<br /> return 1;<br /> }<br /> <br /> //删除个人历史数据<br /> @Override<br /> public Long delSearchHistoryByUserId(String userid, String searchkey) {<br /> String shistory = RedisKeyUtils.getSearchHistoryKey(userid);<br /> return redisSearchTemplate.opsForHash().delete(shistory, searchkey);<br /> }<br /> <br /> //获取个人历史数据列表<br /> @Override<br /> public List getSearchHistoryByUserId(String userid) {<br /> List stringList = null;<br /> String shistory = RedisKeyUtils.getSearchHistoryKey(userid);<br /> boolean b = redisSearchTemplate.hasKey(shistory);<br /> if(b){<br /> Cursor cursor = redisSearchTemplate.opsForHash().scan(shistory, ScanOptions.NONE);<br /> while (cursor.hasNext()) {<br /> Map.Entry map = cursor.next();<br /> String key = map.getKey().toString();<br /> stringList.add(key);<br /> }<br /> return stringList;<br /> }<br /> return null;<br /> }<br /> <br /> //新增一条热词搜索记录,将用户输入的热词存储下来<br /> @Override<br /> public int incrementScoreByUserId(String searchkey) {<br /> Long now = System.currentTimeMillis();<br /> ZSetOperations zSetOperations = redisSearchTemplate.opsForZSet();<br /> ValueOperations valueOperations = redisSearchTemplate.opsForValue();<br /> List title = new ArrayList();<br /> title.add(searchkey);<br /> for (int i = 0, lengh = title.size(); i