在程序员面试中,分布式相关问题很常见,其中“如何快速设计一个个性化推荐系统”这题可难住了不少人。一提到推荐系统,大家脑海里就会冒出大数据人工智能、用户画像这些高大上的概念,感觉只有大厂养着一群技术专家才能搞定,要设计复杂的大数据模型和匹配算法,给用户推荐喜欢的内容,比如美女、香车、美食之类的。可中小公司没那么多资源,不想养一堆专家,也不想太折腾,能不能用轻量化工具实现推荐系统呢?答案是肯定的,今天就教大家用搜索引擎,比如Elasticsearch(简称es),分三步轻松搞定。

一、给推荐内容打标签

不管做什么推荐系统,都得有个“货仓”,也就是存放推荐内容的资料库。像那些香车、美女、美食的推荐素材,一般都是up主上传的。系统要做的第一步,就是给这些上传的内容打标签。打标签不难,上传内容的标题、描述、分类,还有像颜色、适合人群这类信息,都能直接拿来当标签。如果想更精细点,也可以做分词处理,但要是想简化流程,不做分词也行,具体根据业务需求灵活决定。

二、把内容同步到Elasticsearch

打完标签后,就要把这些内容同步到搜索引擎里,这里我们用的是Elasticsearch。es有自己的存储空间,专门用来存放数据。同步的方法有好几种,可以设置定时任务,让系统定时把数据同步过去;也可以通过特定的处理方式,及时把新数据更新到es里。要是数据有删除或者修改,也得同步更新,这样才能保证数据的准确性。同时,我们可以根据不同的推荐场景,在es里建各种索引,把不同类型的推荐数据分类存放,方便后续查找和推荐。

三、构建用户画像实现精准推荐

现在推荐内容有了标签,怎么把合适的内容推荐给对应的用户呢?这就需要构建用户画像,获取用户的标签。用户标签主要有两种。

一种是静态标签,就是用户一些基本固定的信息,像年龄、性别、所在城市、爱好、职业这些。这些信息相对稳定,能反映用户的一些基本特征。

另一种是动态标签,它是根据用户近期的行为生成的。比如,最近一周或一个月,用户总在浏览冬季衣物,想买羽绒服,系统就能悄悄给用户打上“冬季商品采购需求”这样的标签。随着用户浏览和搜索行为的增加,动态标签会越来越丰富,用户画像也就更完整了。之后定期对这些标签进行维护,保证画像的准确性。

有了用户标签和推荐内容标签,就差最后一步呈现了。当用户打开APP或者网页,系统就能用用户的标签在es里搜索资料库。还能根据实际情况给不同标签设置权重,让搜索结果更符合用户需求,然后把匹配到的内容以feed流的形式展示在页面上。这样一来,每个用户看到的内容都不一样,实现了个性化推荐,也就是大家常说的“千人千面”。

怎么样,用Elasticsearch实现个性化推荐系统是不是没那么复杂?中小公司完全可以试试这个方法。要是大家在理解过程中有啥疑问,欢迎在评论区留言讨论,一起交流学习!