2013-05-03 206 views
0

我收集了大约250万条记录。目前我正在使用带有猫鼬的nodejs。我接受任何可以提高当前搜索效率的建议。加快搜索速度

艺术家收集模式是类似的东西:

var Artist = new mongoose.Schema({ 
    realname: String, 
    names: Array 
}); 

用户通过字符串例如:迈克尔·杰克逊被警方迈克尔杰克逊Jillie豆接触。现在我必须找到艺术家/歌手/人,所以唯一合乎逻辑的事情是我可以找到:迭代集合中的所有文档,检查是否有任何名字在给定字符串中,如果是,我们有匹配 - >停止循环。

但是这是非常低效的内存,因为它必须将整个集合加载到内存中,因此nodejs可以遍历并检查所有记录。

看起来,检索整个收藏需要大部分时间。任何方式来加速这一点?在mongoshell中db.collection.find()非常快。但是在nodejs中使用猫鼬需要花太多时间。

  • 为什么.find()如此慢用于猫鼬?
  • 是否有任何其他数据库设计用于此目的?
  • 你会如何更有效地解决这个问题?
  • 可以映射减少在这里的任何用途?
+0

关于您为什么'find'对Mongoose速度太慢的具体问题,请调用['lean()'](http://mongoosejs.com/docs/api.html#query_Query-lean)你的'查询',因为你只需要数据而不是完整的模型对象。如果你这样做,它应该和壳一样快。 – JohnnyHK 2013-05-04 02:40:56

回答

1

你需要的是一个全文搜索。可能的选项:

  • 使用MongoDB text index。 (2.4中新增)
  • 使用附加全文索引。在我看来,elasticsearch非常适合初学者,并且易于理解。
+0

我只是简单地检查了elasticsearch,它看起来像SQL%like%操作符一样工作。我只想反过来。我有一个很长的字符串,现在我必须找到最适合的文档。 – ewooycom 2013-05-03 15:41:00

+0

这正是elasticsearch所做的(或任何其他基于Lucene的解决方案)。没有像MySQL或MongoDB这样的数据库,它们专门查找字符串或字符串的一部分。与其他数据库相反,它们不是以字符串形式操作,而是以单词和单词构造形式操作。 – TheHippo 2013-05-03 16:33:24