起因:
小編近期看了 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、希望此文章能帶給大家一些幫助,幫助大家進步。