我正在尝试使用 Postgres DB 加快 RoR 应用程序中的搜索功能。我不会解释它目前是如何工作的......只需使用 /achieve 方法!
我有 x 条记录(可能是大量记录),每条记录都有一个关联的 Facebook ID 号码数组……可能多达 5k。我需要使用个人的朋友 ID 列表对此进行搜索,以确定搜索数组与任何(以及哪些)记录数组之间是否存在相交。
我不需要知道交集的结果,只知道它是真还是假。
有什么好主意吗?!
谢谢!
我正在尝试使用 Postgres DB 加快 RoR 应用程序中的搜索功能。我不会解释它目前是如何工作的......只需使用 /achieve 方法!
我有 x 条记录(可能是大量记录),每条记录都有一个关联的 Facebook ID 号码数组……可能多达 5k。我需要使用个人的朋友 ID 列表对此进行搜索,以确定搜索数组与任何(以及哪些)记录数组之间是否存在相交。
我不需要知道交集的结果,只知道它是真还是假。
有什么好主意吗?!
谢谢!
只使用纯红宝石,因为您没有提及您的数据存储:
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
@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更快。
这也可能在数据库中执行得更快,但是如果没有关于模型的更多信息,很难组合出一个方法。