2013-05-03 125 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