2010-07-14 62 views
1

我想添加用户搜索自动完成(如Facebook的)到Heroku的我的Rails应用程序,并且我选择将它写入Node.js,因为并发需求。搜索首先从Mongo中抽取用户的好友列表(包括所有Twitter朋友,不仅仅是他们的朋友在我们的网站上),然后搜索该列表中的用户,然后搜索任何其他匹配查询的用户不在朋友搜索返回的结果中。在Node.js/Express.js中从数据库(MongoDB)缓存数组

起初相当快(约150毫秒),但对于拥有更多朋友的用户(总数超过100),加载他们的朋友阵列最终成为一个巨大的瓶颈,将搜索线性减慢到最大对于拥有1,000位朋友的用户而言(自动完成朋友搜索支持的最大数量)大约为1500毫秒。

问题是,我对Node.js和Express(它的类似Sinatra的web框架)是全新的,我不知道如何缓存friends数组,所以我只需要加载它一次(理想情况下记忆)。在Heroku的Rails中,我只是将数组加载到Memcache中,但我甚至不知道如何在Node/Express中配置Memcache,更不用说如果Heroku支持这种情况。

任何想法?

(另请注意,我为这些查询,包括朋友IDS多键索引)

回答

8

我想mongodb将是完成匹配的地方。看起来你正试图将所有的结果放回到你自己的代码中,然后你自己在一个数组中匹配它们。您可能会发现要求mongodb为您筛选前10个匹配结果并将其直接发送给客户端会更快。

关于数据库的最好的部分是,他们可以为你快速做到这一点。它应该超越其他解决方案。信任数据库,MongoDB的全部要点是查询应该非常快速且接近memcache的速度。你只需要问这个正确的问题。而且我想你可以用数据库很难的方式敲击数据库,但是请确保仅请求准备使用的准确匹配数。

要匹配约翰SMI ... 也许这样的事情(我刚才提出这个达人秀的想法):

friendIdList //假设为ID的简单数组从您的应用程序

var matchFriends = db.people.find({person_id:{$ in:friendIdList},name:/ john smi。*/i}).sort({name:1}).limit(10);

见正则表达式MongoDB的文档查询

希望这可以帮助,我只是学习有关MongoDB的,而不是专家,但我这是怎么会即将于其他数据库

6

我知道很少的Node.js或快递。但是,我可以告诉你,你可能想要做这个客户端。 (即:cookie客户端上的朋友列表并使用javascript搜索

如果你看看FB的实现,这就是他们正在做的事情(至少他们是几个月前)。

0

我建议这个问题,如果你不打算把所有的名字预加载到客户端,那么在输入第一个字符后你会更好地进行搜索。这将减少需要搜索的分数的数量,然后将该请求提交给数据库。然后,您可以按字母顺序返回这些结果,因为可以输入更多字符,而无需排序。只要用户没有成千上万名称为“大卫史密斯”的朋友,每个请求就应该满足您的150毫秒的目标。