起因:
小编近期看了 58沈剑 的架构师之路,在里边,小编看到了一篇关于商城里边的推荐系统的理论文章《从0开始做互联网推荐-以58转转为例》,深有感触,但里边没有详细讲解,所以小编就自己琢磨,最近有点研究成果,所以拿来和大家分享,共同学习,一起进步~
商品推荐:
为什么我们需要这个商品推荐呢?淘宝里边的商品成百上千万,但大部分我们是不需要的,只有很少的一部分,才是我们需要的,如果我们不实现商品推荐,我们就不能推送较为适合客户的商品,从而会损失一部分客户资源。所以,我们需要实现商品推荐,来实现客户的买了再买,看了再看的目的。
实现商品推荐
1、收集数据
我们要根据每个不同的客户,来推荐适合他们的产品,这时候,我们就需要采集用户的数据,如:商品购买记录,商品收藏记录,商品评价记录等数据(这篇文章我们只以这三个记录为准)。所以我们需要创建以下三个表:
- 用户商品购买记录表
- 用户商品收藏记录表
- 用户商品评价记录表
问:为什么需要这些表?我们不能直接从商品订单表、用户收藏表、评价表里边分析吗?
答:小编认为这样不好,一是因为后期数据量庞大的时候,读取数据会很慢,不利于我们分析的实时性。二是订单有购买、退款等操作,在数据量大的时候不好识别用户是否退款,不可能每次分析都要去分析全库的,因为有些数据,我们只需要分析一遍就够了,比如购买没退款的。
// 用户购买商品记录表 CREATE TABLE `user_purchase` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `user_id` int(11) NOT NULL COMMENT '用户ID', `gtype_id` int(11) NOT NULL COMMENT '商品类型ID', `goods_id` int(11) NOT NULL COMMENT '商品ID', `goods_spec_id` int(11) NOT NULL COMMENT '商品规格ID', `price` decimal(11,0) NOT NULL COMMENT '购买单价', `num` int(11) NOT NULL COMMENT '购买数量', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户购买商品记录表'; // 用户商品评价记录表 CREATE TABLE `user_evaluate` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `user_id` int(11) NOT NULL COMMENT '用户ID', `gtype_id` int(11) NOT NULL COMMENT '商品类型ID', `goods_id` int(11) NOT NULL COMMENT '商品ID', `goods_spec_id` int(11) NOT NULL COMMENT '商品规格ID', `score` tinyint(2) NOT NULL DEFAULT '1' COMMENT '分数,默认1差评,2中评,3好评', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户商品评价记录表'; // 用户收藏记录表 CREATE TABLE `user_coll` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `user_id` int(11) NOT NULL COMMENT '用户ID', `gtype_id` int(11) NOT NULL COMMENT '商品类型ID', `goods_id` int(11) NOT NULL COMMENT '商品ID', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户收藏记录表';
2、分析数据
我们已经得到了用户的这些数据,接下来,我们便要对这些收集到的数据进行分析,统计起来,所以我们需要三个表来保存这些数据。
- 商品分值表
- 用户商品类型购买分值表
- 用户消费水平表
问:为什么需要用户商品类型购买分值表呢?
答:这是记录用户,根据用户购买某类型下的商品次数,评论数,根据特定的加减算法来得到用户购买的比较多的,比较满意的某类型的商品,然后我们可以推荐一部分这类型的商品给用户。
问:为什么需要商品分值表?
答:这个表记录了所有用户购买商品以来,对于商品的满意分值,分值越大,代表商品越受欢迎。
问:为什么需要用户消费水平表?
答:我们推荐的商品需要符合用户的消费水平,如果不符合,那我们推送也将毫无意义,这个表主要就是记录每个用户的平均消费水平和消费价格区间。
1 /* 商品分值表 */ 2 CREATE TABLE `goods_score` ( 3 `id` int(11) NOT NULL, 4 `gtype_id` int(11) NOT NULL COMMENT '商品类型ID', 5 `goods_id` int(11) NOT NULL COMMENT '商品ID', 6 `score` int(11) NOT NULL COMMENT '分数值' 7 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分值表'; 8 9 /* 用户商品类型购买分值表 */ 10 CREATE TABLE `user_buy_analysis` ( 11 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', 12 `user_id` int(11) NOT NULL COMMENT '用户ID', 13 `gtype_id` int(11) NOT NULL COMMENT '商品类型ID', 14 `score` int(11) NOT NULL COMMENT '当前分数值(用于排序)', 15 PRIMARY KEY (`id`) 16 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户商品类型购买分值表'; 17 18 /* 用户消费水平表 */ 19 CREATE TABLE `user_consumption_analysis` ( 20 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', 21 `user_id` int(11) NOT NULL COMMENT '用户ID', 22 `min_money` decimal(11,2) NOT NULL COMMENT '消费最低金额', 23 `average_money` decimal(11,2) NOT NULL COMMENT '平均消费金额', 24 `max_money` decimal(11,2) NOT NULL COMMENT '消费最高金额', 25 `price_range` varchar(2000) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户消费的价格区间(排序完成)', 26 PRIMARY KEY (`id`) 27 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户消费水平表';
接下来我们需要符合我们业务的打分规则:
- 购买 +5
- 退款 -5
- 收藏 +2
- 好评 +5
- 中评 +2
- 差评 -20
有了上面的规则之后,我们就可以对我们采集到的数据,进行一一分析,并对每一个商品、商品类型进行打分了。我们可以根据我们的商品单价(影响我们要不要购买最多的因素就是:单价),对于我们用户消费水平进行分析了。
4、示例
我们来看以下的四个场景:
- 场景一:用户A(user_id:234)花了53元购买了一件男衣类型(gtype_id:1)的长袖衣服(goods_id:1),并收藏了,收到衣服之后,A非常满意,于是就给了好评。
- 场景二:A花了65元买了一件女衣类型(gtype_id:2)的长裙(goods_id:2)给了自己女朋友,A的女朋友收到货之后,穿的好看,质量也好,于是A很开心的给了好评。
- 场景三:用户A花了24元买了一件男衣类型的短袖(goods_id:3),但是A收到衣服之后,发觉衣服质量存在问题,客服那边有一直拖延,所以A很愤怒,给了一个差评。
- 场景四:用户B(user_id:235)花了49元也买了一件男衣类型的短袖(goods_id:3),B收到衣服之后,质量很满意,所以B很高兴的给了好评。
接下来我们就有了以下的数据了:
1 /* user_purchase: */ 2 id:1,user_id:234,gtype_id:1,goods_id:1,price:53 3 id:2,user_id:234,gtype_id:2,goods_id:2,price:65 4 id:3,user_id:234,gtype_id:1,goods_id:3,price:24 5 id:4,user_id:235,gtype_id:1,goods_id:3,price:24 6 7 /* user_coll: */ 8 id:1,user_id:234,gtype_id:1,goods_id:1 9 10 /* user_evaluate: */ 11 id:1,user_id:234,gtype_id:1,goods_id:1,score:3 12 id:2,user_id:234,gtype_id:2,goods_id:2,score:3 13 id:3,user_id:234,gtype_id:1,goods_id:3,score:1 14 id:4,user_id:235,gtype_id:1,goods_id:3,score:3
有了上面的数据之后,我们就能通过消息队列,对上面的数据进行分析,就得到了如下的分值数据:
/* goods_score(商品分数表): */ id:1,gtype_id:1,goods_id:1,score:5+2+5 = 12 id:2,gtype_id:2,goods_id:2,score:5+5 = 10 id:2,gtype_id:1,goods_id:3,score:5-20+5 = -10 /* user_buy_analysis(用户商品类型购买分值表): */ id:1,user_id:234,gtype_id:1,score:5+2+5+5-20 = -3 id:2,user_id:234,gtype_id:2,score:5+5 = 10 id:3,user_id:235,gtype_id:1,score:5+5 = 10 /* user_consumption_analysis(用户消费水平表): */ id:1,user_id:234,min_money:24,average_money:(24+65+53)/ 3 = 47.33,max_money:65,price_range:{ '50-100': 2,'0-50': 1} id:2,user_id:235,min_money:24,average_money:24,max_money:24,price_range:{ '0-50': 1}
由上面的数据,我们可以分别分析出比较符合用户A和用户B的商品。
/* 符合用户A的商品 */ [ { 'goods_id': 1, 'goods_name': '长袖', 'gtype_id': 1(男衣), 'price': 53 }, { 'goods_id': 3, 'goods_name': '短袖', 'gtype_id': 1(男衣), 'price': 23 }, { 'goods_id': 2, 'goods_name': '长裙', 'gtype_id': 2(女衣), 'price': 65 } ]
结语:
1、此文章是小编自己的心得,由于小编是新手,所以此文章有许多不足之处,请见谅。
2、此文章涉及知识较为浅显,具体的设计还需要结合你自己的业务需要来设计。
3、希望此文章能带给大家一些帮助,帮助大家进步。