检索每个用户(在Django或任何后端)中最相关的输出的最佳解决方案?

时间:2017-06-01 16:38:34

标签: django redis artificial-intelligence ranking relevance

我正在寻找最佳解决方案,以便为每个用户检索最相关的输出。

我将模型简化为UserProfile和Groups,如下所示

-Model Name: UserProfile
styles: ['a', 'b', 'f', 'r'] <- ('styles' are field name)

-Group 1
styles: ['a', 'f']

-Group 2
['g', 'a', 'h']

 ...

-Group 1,000,000
styles: ['s', 'w', 'x']
(Let's say we have millions of Groups)

我想根据用户的样式对组进行排序和检索。 所以在这种情况下,'组1'得分为2,因为样式'a','f', 由于风格'a','组2'得分为1。

我们无法将分数存储在主数据库中,因为每个用户都有不同的样式。

  • 我的方法1:每次用户请求时(我在概念上编写代码)对所有数据库进行排名

views.py

for group in Group.objects.all():
    # store the score to the new field of the group
    group.style_count = group.styles.join_count(user.styles)
list_view_output = Group.objects.order_by(style_count)
  • 方法2:将排名存储在数据库中 执行查询并将输出(具有课程级别和用户ID)存储在Redis内存缓存数据库中。并在特定用户想要
  • 时检索结果

心中的问题:

  1. 查询似乎相当昂贵。 O(n)用于迭代* O(min(user.style.count(),group.style.count()))以进行连接。我怎么能做得更好?也许我可以在Model中做点什么?
  2. 不幸的是,如果我们有一百万个组和1,000个用户,我需要在缓存(Redis)中存储十亿行。我绝对不能负担(我想我最多可以有8GB,或者更多)
  3. 也许我不需要将每个用户的排名数据存储在缓存中,因为有些用户具有相同的样式。你知道任何AI方法吗?
  4. 您是否也可以提供任何建议来更好地建立这个?

    谢谢...... !!!!!

1 个答案:

答案 0 :(得分:0)

最重要的是,对于数百万的问题,保存所有内容并对其进行排序可能不是一个好主意。

使用当前的数据结构,      - 时间复杂度:O(n);几乎不可能减少那个      - 空间复杂性:我们可以改进它。例如只需要前10名,费用可以是O(1)。我们只能以排序的方式保存前10名。在线性扫描中,我们只将新组的分数与最小分数进行比较,如果新分数较大则将其替换为

但是一个可能的问题是,如果你有太多具有相同分数的小组,那么这可能是一个问题。你需要仔细处理它。

如果您以“排序”的方式组织样式和组,也许它可以更快。 例如,按字母顺序,第2组将是['a','g','h']。我们会跟踪前一个或几个字母的索引。例如,以'a'开头的组将是第一批;然后是以'b'开头的组,依此类推。 在您的情况下,您可以这样进行搜索:   1.首先以'a'开头的组;   2.然后搜索以'b'开头的组;   那么'f';   然后'r'。 因此,没有涉及[a,b,f,r]中没有任何样式的组。 通过这种方式,它可以为您节省大量时间。