寫個簡單的搜索引擎

前些日子使用悟空搜索 搭了個簡單的搜索引擎(見這裏 ), 用着還能夠,就是有一點很差,內存佔用的太多了。每次內存用超了,搜索引擎的進程都會被系統幹掉。 由於是和十三哥一塊兒租的服務器,兩我的的程序都在上面跑,平時還作些實驗什麼的, 爲了保證服務器不被搞死,對進程的內存限制暫時是不打算解開的。再說了,就我這麼個小網站, 也就幾百個網頁的量,竟然佔我50%的內存,這確定不行的啊。前端

 

固然,這也不能怪"悟空搜索",由於在去年的 GopherChina 大會上, 就聽見做者在講臺上親口宣佈,說這個數據會全都加載到內存, 我以爲我數據量又不大,數據都放內存也佔不了多少資源嘛,因此就放心大膽的用了,就是結果有點兒出乎個人意料而已。 爲了解決內存佔用過多的問題,一開始我打算修改這個項目的代碼,把數據放到磁盤上,減輕內存的壓力。 不過在開始以前,我想先更詳細的瞭解一下搜索引擎,因此也就沒動手,而是先找了本講搜索引擎的書看了看, 就是這本《這就是搜索引擎》。git

 

首先,感謝做者寫的這本書,講的很詳細,也很透徹,致使我看完了這本書,以爲我本身也能寫個搜索引擎。 對於個人搜索引擎,效率和可用性先放在一邊,和正經的搜索引擎確定無法比,可是,能用。^_^github

 

索性我也別改"悟空搜索"了,先寫個本身的搜索引擎練練手吧。而後就有了這個東西。目前已經在個人網站使用了, 地址是http://www.fengbohello.top/s 。有興趣的同窗能夠去看看, 搜索結果還很粗糙,結果展現頁面也沒深加工,目前就是能湊合着用,對於查找我本身的資料還行, 由於一共也沒多少數據,也就 400 來個網頁。算法


下面來講說我都幹了啥:json

 

第一,固然就是設計框架。服務器

由於以前使用了"悟空搜索",個人網站後臺和前端以及和搜索引擎以前的接口都是現成的, 我也不想再從新走出一條路,就用以前的東西(在這裏)。數據結構

 

第二,就是找庫。框架

先是找分詞庫,選中了 friso。這個分詞庫用起來也很簡單,容易和其它項目結合。測試

在"搜索引擎"可以進入測試階段以後,就能夠上線了。上次是使用 GO語言 的 HTTPD 服務來 給個人網站提供的查詢。不過此次我想嘗試一下其它的方式,好比 RPC。 最後找到了 jsonrpc-c,發現簡單又好用,那就它了。 目前這個項目直接依賴的庫就是這兩個(jsonrpc-c 還會依賴 libev)。網站

 

第三,就是寫代碼。

這點仍是有點兒感觸的。由於這個引擎是用C寫的,在碼代碼的過程當中,發現有些在 C++ 上做爲標配的數據結構沒有,好比 map,好比 vector。做爲練手,我也順便寫了個相似 vector 的容器 和一個 map,不過 map 是用平衡二叉樹實現的,而不是紅黑樹。作這些邊角料的工做, 也增長了我對內存更精確的掌控能力。

 

第四,是使用哪一種方式計算文檔的類似度。

這裏我使用的是向量空間的方式,由於這種方式實現起來最簡單了。 之後有時間再嘗試使用更復雜的算法。

 

至於更具體的有關"搜索引擎"的數據結構方面的介紹,基本是根據《這就是搜索引擎》來實現的。 下一篇來介紹具體的數據結構的實現,好比單詞索引、倒排索引和文檔的類似度計算等內容。

 


 

同步地址:http://www.fengbohello.top/blog/p/momi-search

相關文章
相關標籤/搜索