標籤:

如何利用mongodb+node.js完成一個搜索的功能?

使用某個用戶輸入的關鍵字搜索,將搜索結果根據文章標題、關鍵字、內容的匹配度進行排序,現在已經了解了mongodb的text search,但之後要怎麼做感覺沒什麼思路,要如何根據匹配度來排序呢?需要什麼演算法?


用mongodb做模糊搜索是作死。。

hash結構對於模糊查詢無能為力,除非你搜索特定的詞,然後做相關索引可以增加效率,但是收益還是小,建議上Lucence或者Sphinx來配合mongodb來做搜索。

哎,別問我為什麼知道。。這是一個痛苦的回答。


你覺得你應該用Mongo,但你真正要找的很可能是Elastic


全文檢索的核心是分詞,而不是搜索。任何簡單的key/value存儲都可以支持搜索。mongodb 當然可以用來做全文檢索的搜索,只要分詞演算法是你在外面實現。只是對於 key/value 的存儲,mongodb 並非是最有效率的。


使用 b-tree 索引導致在查找過程中只有 prefix 能使用索引,所以不太適合用來做搜索。

你可以用 elasticsearch 來做搜索,水平擴展性好,支持 RESTful API,還有一套類似 JSON 的 DSL。

我們基於 elasticsearch 做過這樣一個項目 http://www.tinysou.com,提供 RESTful api 也提供 nodejs 的庫,像你這種簡單需求可以試一下。畢竟直接用 elasticsearch 還是要踩很多坑的。

項目正式的話還是用 elasticsearch 吧,因為團隊已經解散了。


這其實算是一個簡單的Search Engine吧,database本身,不管是Mongo還是其他,都是不適合這種場景的……尤其是如果你想自定義排序演算法的話那就更加困難了。

如果數據量比較小的話,建議先嘗試一下LUCENE - https://lucene.apache.org/ . 之前在CMU上過Search Engine,經驗就是在Lucene的基礎上自己寫ranking演算法其實完全不難,畢竟建索引之類的別人都寫好了。開始可以先嘗試一些經典的演算法,比如TFIDF,BM25,Indri等等。這些經典演算法一般來說已經可以達到很不錯的效果了。

如果數據量比較大,可以嘗試一下 ElasticSearch Elasticsearch: RESTful, Distributed Search Analytics. 本人沒有親自試用過,據用過的同學介紹差不多就是分散式的Lucene。


推薦閱讀:

有哪些比較好用的nodejs模塊?
有哪些值得推薦的針對 Node.js 本身而非 Express 框架之類的學習資料?
NodeJS的desktop應用開發中,關於Electron的中文文檔或者博客之類的很少?
為什麼nodejs的module.js里用了readFileSync而不用readFile?
想學習nodejs 有什麼書可以推薦的?

TAG:Nodejs | mongo |