前些日子使用悟空搜索 搭了個簡單的搜索引擎(見這里 ), 用着還可以,就是有一點不好,內存占用的太多了。每次內存用超了,搜索引擎的進程都會被系統干掉。 因為是和十三哥一起租的服務器,兩個人的程序都在上面跑,平時還做些實驗什么的, 為了保證服務器不被搞死,對進程的內存限制暫時是不打算解開的。再說了,就我這么個小網站, 也就幾百個網頁的量,居然占我50%的內存,這肯定不行的啊。
當然,這也不能怪"悟空搜索",因為在去年的 GopherChina 大會上, 就聽見作者在講台上親口宣布,說這個數據會全都加載到內存, 我覺得我數據量又不大,數據都放內存也占不了多少資源嘛,所以就放心大膽的用了,就是結果有點兒出乎我的意料而已。 為了解決內存占用過多的問題,一開始我打算修改這個項目的代碼,把數據放到磁盤上,減輕內存的壓力。 不過在開始之前,我想先更詳細的了解一下搜索引擎,所以也就沒動手,而是先找了本講搜索引擎的書看了看, 就是這本《這就是搜索引擎》。
首先,感謝作者寫的這本書,講的很詳細,也很透徹,導致我看完了這本書,覺得我自己也能寫個搜索引擎。 對於我的搜索引擎,效率和可用性先放在一邊,和正經的搜索引擎肯定沒法比,但是,能用。^_^
索性我也別改"悟空搜索"了,先寫個自己的搜索引擎練練手吧。然后就有了這個東西。目前已經在我的網站使用了, 地址是http://www.fengbohello.top/s 。有興趣的同學可以去看看, 搜索結果還很粗糙,結果展示頁面也沒深加工,目前就是能湊合着用,對於查找我自己的資料還行, 因為一共也沒多少數據,也就 400 來個網頁。
下面來說說我都干了啥:
第一,當然就是設計框架。
因為之前使用了"悟空搜索",我的網站后台和前端以及和搜索引擎之前的接口都是現成的, 我也不想再重新走出一條路,就用之前的東西(在這里)。
第二,就是找庫。
先是找分詞庫,選中了 friso。這個分詞庫用起來也很簡單,容易和其它項目結合。
在"搜索引擎"能夠進入測試階段之后,就可以上線了。上次是使用 GO語言 的 HTTPD 服務來 給我的網站提供的查詢。不過這次我想嘗試一下其它的方式,比如 RPC。 最后找到了 jsonrpc-c,發現簡單又好用,那就它了。 目前這個項目直接依賴的庫就是這兩個(jsonrpc-c 還會依賴 libev)。
第三,就是寫代碼。
這點還是有點兒感觸的。因為這個引擎是用C寫的,在碼代碼的過程中,發現有些在 C++ 上作為標配的數據結構沒有,比如 map,比如 vector。作為練手,我也順便寫了個類似 vector 的容器 和一個 map,不過 map 是用平衡二叉樹實現的,而不是紅黑樹。做這些邊角料的工作, 也增加了我對內存更精確的掌控能力。
第四,是使用哪種方式計算文檔的相似度。
這里我使用的是向量空間的方式,因為這種方式實現起來最簡單了。 以后有時間再嘗試使用更復雜的算法。
至於更具體的有關"搜索引擎"的數據結構方面的介紹,基本是根據《這就是搜索引擎》來實現的。 下一篇來介紹具體的數據結構的實現,比如單詞索引、倒排索引和文檔的相似度計算等內容。