我正在尝试使用Postgres DB在RoR应用程序中加速搜索功能。我现在不会解释它是如何工作的......只需采用/ achieve方法!
我有x个记录(可能是一个很大的数字),每个记录都有一个相关的Facebook ID号数组......可能高达5k。我需要使用个人的朋友ID列表进行搜索,以确定搜索数组与任何(以及哪些)记录数组之间是否存在交叉。
我不需要知道交集的结果,只是它是真还是假。
有什么好主意吗?!
谢谢!
答案 0 :(得分:3)
由于您未提及数据存储区,因此只使用纯红宝石:
friend_ids = user.friend_ids
results = records.select { |record| !(record.friend_ids & friend_ids).empty? }
results
将包含至少共有1个friend_id的所有记录。如果您必须检查大量记录,这将不会非常快。
&
是数组交集运算符,用C实现,你可以在这里看到它:http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-26
答案 1 :(得分: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更快。
这也可能在数据库中执行得更快,但如果没有关于模型的更多信息,则很难编写方法。