我想将用户搜索自动完成(如Facebook的)添加到Heroku上的Rails应用程序中,由于并发要求,我选择在Node.js中编写它。搜索首先从Mongo中提取用户的朋友列表(id,包括所有Twitter朋友,而不仅仅是他们在我们网站上的朋友),然后在该列表中搜索用户,然后再搜索与该查询匹配的任何其他用户没有在朋友搜索返回的结果中。
这开始时速度相当快(约150毫秒),但对于拥有更多朋友的用户(例如,总共100个以上),加载他们的朋友阵列最终成为一个巨大的瓶颈,线性地将搜索速度降低到最大值对于拥有1,000个朋友的用户,大约1500毫秒(自动填充朋友搜索支持的最大数量)。
问题是,我对Node.js和Express(它类似Sinatra的Web框架)完全不熟悉,我不知道如何缓存friends数组,所以我只需要加载一次(理想情况下加载到内存中) )。在Heroku的Rails中,我只是将数组加载到Memcache中,但我甚至不确定如何在Node / Express中配置Memcache,更不用说如果在Heroku上支持它。
有什么想法吗?
(另请注意,我是所有这些查询的多键索引,包括朋友ID)
答案 0 :(得分:8)
我想mongodb将成为完成匹配的地方。您似乎正在尝试将所有结果返回到您自己的代码中,然后在数组中自己匹配它们。您可能会发现要求mongodb为您过滤掉前10个匹配结果然后直接将其发送给客户端会更快。
关于数据库的最好的部分是他们可以快速为您做过滤。它应该远远超出其他解决方案。信任数据库,mongodb的重点是查询应该非常快,并且接近memcache的速度。你只需要问正确的问题。而且我想你可以用力锤击数据库,但请确保只请求你打算使用的确切#匹配。
匹配John Smi ...... 也许这样的事情(我只是为了表明这个想法):
friendIdList //假设你的应用程序是一个简单的id数组
var matchFriends = db.people.find({person_id:{$ in:friendIdList},name:/ john smi。* / i})。sort({name:1})。limit(10);
请参阅有关正则表达式查询的mongodb文档
希望这有帮助,我只是在学习mongodb而不是专家,但这就是我在其他数据库上解决问题的方法
答案 1 :(得分:6)
我对Node.js或Express知之甚少。但是,我可以告诉你,你可能想要做这个客户端。 (即:客户端上的朋友列表cookie并使用javascript进行搜索)
如果你看一下FB的实现,这就是他们正在做的事情(至少是几个月前)。
答案 2 :(得分:0)
我建议,如果您不打算将所有名称预先加载到客户端,那么在输入第一个字符后,您最好进行搜索。这将减少搜索分数所需的名称数量,然后将该请求提交给数据库。然后,您可以按字母顺序返回这些结果,一旦输入更多字符,您可以在不进行排序的情况下进行过滤。只要用户没有数千名称为“David Smith”的朋友,每个请求都应符合您的150ms目标。