未加星标

【Redis】Redis 与搜索热词推荐

字体大小 | |
[数据库(综合) 所属分类 数据库(综合) | 发布者 店小二05 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

## 【Redis】Redis 与搜索热词推荐 08 Dec 2015

##摘要

本篇解决一个非常普通的需求:在用户输入搜索关键词的过程中,系统给出搜索的推荐关键词。 实现的方式还是通过 redis ,这次使用它5种数据结构中的 zset ,也就是有序集合。

Redis的有序集合(zset)

关于有序集合不过多赘述,先给出传送门: Redis 有序集合 。

在有序集合中, redis 中某个 key 存储一个拥有多个 value 值的集合,并且集合中每个 value 都附带一个 score ,这个 score 是 value 的评分,有序集合中的 value 存储时候按照 score 排序,这样的效率叼叼的,具体实现方式推荐翻阅 《Redis设计与实现》 。

搜索热词推荐

这个功能的样子很常见,在各种大网站的搜索框里,当你输入关键词输入到一半时会推荐给你搜索热词。

在美团技术团队2014年的博客文章中也曾提到过此类实现,具体可参考美团博客的文章 搜索引擎关键字智能提示的一种实现 。

实现思路 一、简单的需求分析

对于一个搜索关键词的联想大抵分为几种情况,比如假设用户想要搜索 北京雾霾 这样一个概念。

但当他去搜索这个概念的时候,可能输入的是:

1. 拼音: beijingwumai, beijingwu 2. 首字母: bjwm、bj 3. 文字前缀: 北京、北京雾 4. 文字相关: 北京霾、霾、雾霾 5. 完整输入: 北京雾霾

我们需要根据用户输入去建立索引,从索引找到用户最可能的搜索意图。

对于 redis 来讲,就要确定此处的 key 和 value来建立索引。

二、建立索引

在本文描述的实现思路里,索引的建立我们分两步,这两部是衔接的:

1. 建立关键词指向搜索意图的索引 2. 建立关键词前缀指向关键词的索引

第一步,这里的关键词,就是一个搜索意图所包含的关键词,所以首先需要对搜索意图进行分词预处理。

比如 北京雾霾 这个搜索意图所包含的关键词,是 北京 雾霾 霾 。

这3个关键词我们需要建立3个key,这3个key都是 redis 中的有序集合key,都存储着一个集合,集合中的value就是搜索意图。

为什么是个集合呢?很简单,因为一个关键词可能同时是不同搜索意图的关键词,比如 北京 这个关键词,除了是 北京雾霾 这个搜索意图的关键词,还可能是 北京下雪 这个搜索意图的关键词,所以,一个关键词会拥有一个有序集合key,这个key里存储了不同的搜索意图。 (这里可能有分词技术的瓶颈)

第二步,我们需要给第一步中提到的关键词,分别建立其各种前缀的索引。

意思就是,如果用户输入 beijing 北 或者 beijin 我们该怎么办?我们需要通过这个输入,来找到 北京 这个关键词,进而通过关键词找到搜索意图,所以需要建立文字前缀以及拼音前缀到关键词的一个索引。

同样的道理,一个关键词(如 北京 ),它拥有多少前缀,就会建立多少个有序集合key,每个key里都保存着value集合。

比如 北 是 北京 的前缀,那 北京 就在以 北 为key的有序集合里,并且,其他的关键词如 北方 也可能在这个集合里。

三、搜索意图的权值

通过上面一节中所说的建立索引,我们就能通过 beijing 找到 北京 进而找到 北京雾霾 了。

但问题来了,既然每一个key都是一个集合,集合中有不同的value,当用户输入 北 这个字的时候,我们是推荐给他 北京 还是 北方 呢?

解决这个问题,就需要 redis 有序集合中的另一个特性:通过score来排序。

我们建立索引时候使用有序集合,这样每一个key所对应的集合都是有序的,并且每一个集合中的value都有score值,比如 北 这个key中的value 北京 和 北方 是分别有score值的,建立索引时,将热词的score值按照热度调大,这样越热门的关键词score值就越大,系统给出搜索推荐的时候,取score值大的就行了。

四、推荐搜索热词

当用户输入 beijing 的时候,系统将会做两个动作: 1. 找出以 beijing 为前缀key的有序集合,并取出score值最大的几个value作为关键词。 2. 通过第1步取到的关键词,找出其对应的key,找出有序集合,并取出score值最大的几个value作为搜索热词的推荐结果并返回。

这样就能给出搜索推荐热词了。

##总结

优化自己的分词以及权值分配,通过本文的实现思路就能给出很好的搜索热词推荐服务。

本文数据库(综合)相关术语:系统安全软件

分页:12
转载请注明
本文标题:【Redis】Redis 与搜索热词推荐
本站链接:http://www.codesec.net/view/482143.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 数据库(综合) | 评论(0) | 阅读(39)