热词搜索

需求:当无搜索结果或搜索结果只有一页时,显示搜索热词。最多显示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

 

https://www.jianshu.com/p/fdac76579aa1

https://blog.csdn.net/wangh92/article/details/80052607

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值