2

我正在尝试使用 Postgres DB 加快 RoR 应用程序中的搜索功能。我不会解释它目前是如何工作的......只需使用 /achieve 方法!

我有 x 条记录(可能是大量记录),每条记录都有一个关联的 Facebook ID 号码数组……可能多达 5k。我需要使用个人的朋友 ID 列表对此进行搜索,以确定搜索数组与任何(以及哪些)记录数组之间是否存在相交。

我不需要知道交集的结果,只知道它是真还是假。

有什么好主意吗?!

谢谢!

4

2 回答 2

3

只使用纯红宝石,因为您没有提及您的数据存储:

friend_ids = user.friend_ids
results = records.select { |record| !(record.friend_ids & friend_ids).empty? }

results将包含至少有 1 个共同朋友 ID 的所有记录。如果您必须检查大量记录,这不会很快。

&是数组交集运算符,它是用 C 实现的,你可以在这里看到它:http ://www.ruby-doc.org/core-1.9.3/Array.html#method-i-26

于 2012-05-04T06:59:34.397 回答
1

@ctcherry 答案的一个可能更快的版本,尤其是在user.friend_ids具有高基数的情况下:

require 'set'
user_friend_ids = Set[ user.friend_ids ]
results = records.select { |record|
  record.friend_ids.any? { |friend_id| user_friend_ids.include? friend_id }
}

由于这仅为 user.freind_ids 构建了一次测试集(哈希),因此它可能也比 @Tass 链接的Array#memory_efficient_intersect更快。

这也可能在数据库中执行得更快,但是如果没有关于模型的更多信息,很难组合出一个方法。

于 2012-05-04T21:44:41.990 回答