搜索词
需求:当无搜索结果或搜索结果只有一页时,显示搜索热词。最多显示5个热词。
热词:按照用户搜索的关键字以及搜索到的结果数量进行排序,数量越多的越排到前面,从而得到热词。
实现分析
根据热词的定义,我们可以知道,热词是来源于用户的搜索,那么就要记录用户的搜索关键字以及结果数量,然后
再排序得到热词。
说明:
- 用户搜索数据,首先进行elasticsearch搜索
- 在搜索完成后,进行判断,是否需要查询热词
- 如果不需要,直返返回用户数据即可
- 如果需要查询,则进行再Redis中查询热词
- 对于用户搜索词的处理有两种方案
- 第一种方案,是在程序中进行处理,并且把搜索词以及命中的数据数量存储到redis中。该方案是同步进行。
- 第二种方案,是将查询信息先记录到日志文件中,由后续的程序做处理,然后再写入到Redis中。该方案
- 是异步进行。
后天实现办法:这里采用第一种方式
@Autowired
private StringRedisTemplate redisTemplate;
private static final String redisKey = "HOT:word";
//热词开始
SearchResult result = new SearchResult(); //返回结果集实体类
if (totalPages <= 1) { //需要查询热词,按照得分倒序排序,获取前5条数据
Set<String> set = this.redisTemplate.opsForZSet().reverseRange(redisKey, 0, 4);
result.setHotWord(set);
}// 处理热词
long count = ((Math.max(totalPages, 1) - 1) * request.getSize()) + goodsList.size();
// 采用zset方式进行存储,值所对应的得分是数据条数
this.redisTemplate.opsForZSet().add(redisKey, key, count);
//根据key获取长度
Long size = redisTemplate.opsForZSet().size(redisKey);
//range按照评分从小到大排序
System.out.println(redisTemplate.opsForZSet().range(redisKey,0,-1));//[aa, cc, dd, 华为, 手机]
//根据下标删除,评分从小到大
System.out.println(redisTemplate.opsForZSet().removeRange(redisKey,0,size-2));//4
System.out.println(redisTemplate.opsForZSet().range(redisKey,0,-1));//[手机]
//热词结束
在key=ab的时候,搜索结果如下图,手机的count最大,因此排名第一
注释:
Redis 有序集合(sorted set)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复
redis讲解地址:https://www.runoob.com/redis/redis-sorted-sets.html
https://www.cnblogs.com/yanan7890/p/6617305.html
https://www.cnblogs.com/songanwei/p/9274348.html
文章最后发布于: 2019-07-29 12:24:31
相关阅读
最近一朋友想做个淘宝导购站,让我帮忙找下关键词,老样子先看下拉框再看相关搜索、百度指数,最终决择在关键词推荐,最后一步的时候发现
在互联网发达的今天,每当我们遇到不懂的问题,首先问的就是百度,但是有时候度娘给出的并不是我们想要的答案或者更本搜不到答案,怎么办
淘宝宝贝的关键词影响着宝贝排名,很多卖家都会设置关键词都会搜索关键词排行榜,但是不知道淘宝搜索关键词排行榜在哪里?寻渠道有哪
小红书相信大家都不陌生吧,小红书是时下一个比较红的网购平台,就和聚美优品、拼多多一样。不过,对于小红书大家还是有些怀疑的,小红书
人肉搜索vs电脑搜索 人肉搜索引擎其实就是在一个社区里面提出一个问题,由人工参与解答而非搜索引擎通过机器自动算法获得结果的搜