如何利用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 有什麼書可以推薦的?