我正在尝试制作轻量级推荐引擎。我已经考虑了几个小时如何完成这个,我想我可能会有所作为,但我需要第三人对此事的看法。这是:
我们说我有100,000个可能的不同项目,每个用户可以将任意数量的项目添加到他的inventory
。
用户也可以在其wishlist
中添加任意100,000件商品。
假设用户将100个项目添加到他的心愿单中,我想找到所有其他用户在他们的库存中有这些项目。然后根据谁拥有最多的项目对他们进行排名。
我想解决这个问题的第一种方法是通过简单的MySQL连接。我尝试启动一些测试数据,只有50,000个用户各自拥有自己的库存/心愿单,查询似乎很慢(~10s),还有更多的分页?所以我认为可能在不同的软件上进行数据聚合,将数据移植到另一个软件(或表)以进行翻页。
我也试过了几件事(Redis LUA循环,MongoDB MapReduce),但它们都产生了相同的速度。我想做的就是能够实时做到这一点,我无法帮助但想知道这是否可能,而且我还没有找到合适的解决方案。或者说,我可能只是让事情变得复杂。我最近的探索让我有点操作,因为我听说他们的速度相当快,但我似乎也遇到了障碍。
我的想法是让每个用户都有一个包含100,000个字符的字符串,其中包含1和0,其中每个字符/位代表用户库存中的项目。
每个用户的心愿单都会有另一个字符串,用作对数据库的查询。
理想的是循环每个用户,使用wishlist和库存执行AND操作并计算结果中的位数。完成循环后,将结果传输到另一个可以翻页的表。
我知道100,000位二进制文件有点傻。甚至可以对这样的事情进行二元运算吗?你认为还有其他解决方案吗?我还没有看到的一件事是使用布隆过滤器来消除用户心愿单上没有单个项目的用户,这将缩小搜索用户的数量。我对任何建议持开放态度。
编辑:
这是我在MySQL中想要改进的内容:
SELECT
user_id, SUM(card_qty) qty
FROM (
SELECT
cc.user_id, card_info_id, LEAST(c.card_qty, cc.card_qty) card_qty
FROM mb_decks d
JOIN mb_decks_cards c USING (deck_id)
JOIN mb_collection_cards cc USING (card_info_id)
WHERE d.deck_id = 1
AND cc.user_id <> d.deck_user_id
) t1
GROUP BY user_id
ORDER BY qty DESC;
# Showing rows 0 - 24 (33002 total, Query took 4.2979 sec)
请下载架构和测试数据here。
答案 0 :(得分:0)
您的查询和表格是什么样的?对于使用正确索引的这个问题,这个问题不应该太难。
如果您真的开始使用mysql,那么有弹性搜索可以用于这种快速查询。