热词搜索
需求:當無搜索結果或搜索結果只有一頁時,顯示搜索熱詞。最多顯示5個熱詞。
熱詞:按照用戶搜索的關鍵字以及搜索到的結果數(shù)量進行排序,數(shù)量越多的越排到前面,從而得到熱詞。
實現(xiàn)分析
根據(jù)熱詞的定義,我們可以知道,熱詞是來源于用戶的搜索,那么就要記錄用戶的搜索關鍵字以及結果數(shù)量,然后
再排序得到熱詞。
說明:
- 用戶搜索數(shù)據(jù),首先進行Elasticsearch搜索
- 在搜索完成后,進行判斷,是否需要查詢熱詞
- 如果不需要,直返返回用戶數(shù)據(jù)即可
- 如果需要查詢,則進行再Redis中查詢熱詞
- ?對于用戶搜索詞的處理有兩種方案
- 第一種方案,是在程序中進行處理,并且把搜索詞以及命中的數(shù)據(jù)數(shù)量存儲到redis中。該方案是同步進行。
- 第二種方案,是將查詢信息先記錄到日志文件中,由后續(xù)的程序做處理,然后再寫入到Redis中。該方案
- 是異步進行。
?后天實現(xiàn)辦法:這里采用第一種方式
@Autowired private StringRedisTemplate redisTemplate; private static final String redisKey = "HOT:WORD"; //熱詞開始SearchResult result = new SearchResult(); //返回結果集實體類if (totalPages <= 1) { //需要查詢熱詞,按照得分倒序排序,獲取前5條數(shù)據(jù)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方式進行存儲,值所對應的得分是數(shù)據(jù)條數(shù)this.redisTemplate.opsForZSet().add(redisKey, key, count); //根據(jù)key獲取長度Long size = redisTemplate.opsForZSet().size(redisKey);//range按照評分從小到大排序System.out.println(redisTemplate.opsForZSet().range(redisKey,0,-1));//[aa, cc, dd, 華為, 手機]//根據(jù)下標刪除,評分從小到大System.out.println(redisTemplate.opsForZSet().removeRange(redisKey,0,size-2));//4System.out.println(redisTemplate.opsForZSet().range(redisKey,0,-1));//[手機]//熱詞結束在key=ab的時候,搜索結果如下圖,手機的count最大,因此排名第一
注釋:
Redis 有序集合(sorted set)
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯(lián)一個double類型的分數(shù)。redis正是通過分數(shù)來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(shù)(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
?
總結
- 上一篇: Lucene 搜索词分词
- 下一篇: Aseprite入门教程