我想将用户搜索自动完成(如Facebook的)添加到Heroku上的Rails应用程序中,由于并发要求,我选择在Node.js中编写它.搜索首先从Mongo中提取用户的朋友列表(id,包括所有Twitter朋友,而不仅仅是他们在我们网站上的朋友),然后在该列表中搜索用户,然后再搜索与该查询匹配的任何其他用户没有在朋友搜索返回的结果中.
这开始时速度相当快(约150毫秒),但对于拥有更多朋友的用户(比如说,总共100个),加载他们的朋友阵列最终成为一个巨大的瓶颈,线性地将搜索速度降低到最大约1500毫秒对于拥有1,000个朋友的用户(自动填充朋友搜索支持的最大数量).
问题是,我对Node.js和Express(它类似Sinatra的Web框架)完全陌生,我不知道如何缓存friends数组,所以我只需要加载一次(理想情况下加载到内存中).在Heroku上的Rails中,我只是将数组加载到Memcache中,但我甚至不确定如何在Node/Express中配置Memcache,更不用说如果在Heroku上支持它.
有任何想法吗?
(另请注意,我是所有这些查询的多键索引,包括朋友ID)
我想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而不是专家,但这就是我如何处理其他数据库的问题
我对Node.js或Express知之甚少.但是,我可以告诉你,你可能想要做这个客户端.(即:cookie客户端上的好友列表并使用javascript进行搜索)
如果你看一下FB的实现,这就是他们正在做的事情(至少他们是几个月前).