2

我在电影推荐引擎工作,我正面临数据库设计问题。我的实际数据库如下所示:

MOVIES [ID,TITLE] 
KEYWORDS_TABLE [ID,KEY_ID] 
  • 其中 ID 是 MOVIES.id 的外键,KEY_ID 是文本关键字表的键

这不是整个数据库,但我在这里展示了对我的问题重要的内容。我有大约 50,000 部电影和大约 1,300,000 个关键字相关性,基本上我的算法包括提取所有与给定电影具有相同关键字的人,然后按关键字相关性的数量对它们进行排序。

例如,我查找类似于“Cast away”的电影,它返回“六天六夜”,因为它具有最多的关键字相关性(4 个关键字):

Island
Airplane crash
Stranded
Pilot

该算法基于更多的因素,但这一因素对于该方法来说是最重要和最困难的。

基本上,我现在所做的是获取所有至少有一个关键字与给定电影相似的电影,然后按其他暂时不重要的因素对它们进行排序。

如果没有这么多的记录不会有任何问题,一个查询在许多情况下持续长达 10-20 秒,其中一些甚至返回超过 5000 部电影。有人已经在这里帮助我(感谢 Mark Byers)优化查询,但这还不够,因为它需要的时间太长

SELECT DISTINCT M.title
FROM keywords_table K1
JOIN keywords_table K2
ON K2.key_id = K1.key_id
JOIN movies M
ON K2.id = M.id
WHERE K1.id = 4

所以我认为如果我为每部电影预先制作带有电影推荐的列表会更好,但我不确定如何设计表格..这是一个好主意还是你会如何采用这种方法?

4

1 回答 1

1

@Supyxy 电影推荐的更好方法是使用基于分析电影数据库后生成的抽象特征的神经网络方法(生成这些特征的因素可以是关键字|人们的收视率|导演姓名|演员等)。Filmmaster项目提供了一个示例开源电影推荐引擎。您可以在 wiki 上阅读:http: //filmaster.org/display/DEV/New+recommendation+engine并从 bitbucket 存储库获取代码:http: //bitbucket.org/filmaster/filmmaster-test/src /tip/count_recommendations.cpp

但是回答您在当前解决方案中遇到的问题,如果进一步的查询优化失败,我会在数据中添加更多冗余,以便为每部电影存储对类似电影的引用(计算可以懒惰地完成,也可以每天在 cron 工作中完成,因为这些值应该不经常改变)。

于 2010-06-17T13:50:48.930 回答