用Golang寫一個搜尋引擎(0x0B)--- 第一部分結束

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

這一篇算給這一個系列告一個小的段落,之前開始寫這些文章的時候,只是想把自己最近用Golang寫的這個搜尋引擎說一說,準備了大概3,4篇的量,但是一寫下來,發現有點收不住,寫到後面其實和Golang沒什麼關係了,主要在寫搜尋引擎的架構和一些資料結構了,我覺得這比寫代碼注釋有用吧,而且通過這樣寫下來,我自己對這些個資料結構的理解也更深了。

一個月的時間,寫了14篇了,雖然14篇文字不足以說明一個搜尋引擎的實現,但我覺得基本上一些重要的東西我都說了,搜尋引擎本身原理上其實比較簡單,並且我們並沒有涉及搜尋引擎爬蟲的部分,所以說起來並不是很複雜,複雜是複雜在外圍一些演算法上的東西,比如分詞,比如排序之類的。

來看看我們都說了些啥

  • 開了個頭以後,先說了一下搜尋引擎的基本概念,包括docid的概念,以及整個搜尋引擎的分層情況

  • 然後說了倒排索引技術,也是搜尋引擎最最底層和核心的概念了。

  • 倒排索引分成詞典和倒排檔案兩部分,接著說了一下倒排索引的詞典的幾種實現方式,包括雜湊表和B+樹的方式,並且簡單介紹了一下跳錶。

  • 倒排索引技術說完了以後,按步驟的說了倒排索引的構建,包括全量和增量的構建,以及各種構建方式,最後說了一下我的構建方法。

  • 倒排的原理,資料結構,構建方式介紹完了以後花了一篇介紹了一下正排索引。

  • 倒排和正排兩個基礎資料結構說完了以後說了索引的分段策略,分段是為了更靈活的使用索引而出現的一種技術。

  • 段之後就是索引層了,索引層先說了資料如何進行增刪改。

  • 最後介紹了一下資料的檢索,包括一些求交集,求並集的過程,這一篇實際上就是索引層之上的引擎層做的事了。

然後除了上面這些,穿插的說了一下搜尋引擎的一些外圍的技術,包括文本相關性,排序,機器學習和長尾詞的一些問題。

照這樣,第一部分應該差不多可以結束了,一個單機版的搜尋引擎只需要上面一些東西就可以完整的實現了,也歡迎大家去我的github上看看,目前開源出來的就是一個簡單的單機版的搜尋引擎了,主要的結構如下,很簡單的,歡迎提交bug,由於是自己的玩具項目,沒有寫單元測試,代碼中的_test.go檔案都是功能測試。

但是,這個系列也遠沒結束,關於搜尋引擎還有好多可以說的,並且索引分區和分布式都還沒開始呢,只是第一部分的單機版的結束了,後面會用一個系列說一下搜尋引擎的分布式實現,當然代碼也會跟著更新。

後面的文章更新還是會圍著搜尋,推薦和廣告這三個方面來說,我覺得這三個其實是一體的,用的技術也差不多,演算法上三個看上去有區別,其實底層也差不太多,特別是廣告,簡直就是推薦+搜尋的組合,所以文章在架構和演算法上也都會涉及到,當然也會有比較扯淡的文章,比如今天這篇。

最後,既然是Golang寫的搜尋引擎,那麼我們來聊聊Golang吧。

用了快一年的Golang了,我是從C/C++轉過來的,之前近10年都在和C++打交道,除了C/C++,用過python,objective-C,C#,Lua,Erlang,很抱歉,沒有用過世界上最好的語言PHP,也沒有用過世界上最火的語言JAVA(用來寫hadoop作業應該不算用JAVA吧),我個人覺得Golang設計出來完全就是一門工程性的語言,工程性非常強,確實很適合後台類型的開發。

這裡不做語言之爭,僅寫寫我的一些感受吧,總的來說,我個人覺得Golang非常棒。

我們來先說好的

  • 開發效率和之前的c比起來不知道高了多少倍,基礎資料結構比較全,其實主要就是map啦。

  • 更舒服的是感覺用起來和c差別不大,有指標哦,這點對於一個C程式員來說很重要哦。

  • 把介面用活就能寫出好的Golang代碼,設計模式那一套不用套來套去了,當然,設計模式那一套思想我覺得還是很有用的。

  • error傳回值,這點可能個人愛好吧,我覺得挺好,不用去捕獲什麼異常了,特別JAVA那種(雖然沒寫過,但JAVA代碼還是看過不少的)一個異常可以像盜夢空間一樣拋出好幾層簡直就是噩夢,出錯了就出錯了唄,返回錯誤就行,還來個什麼異常做甚。

  • 協程和管道就不說了,各種討論已經很多了。

  • 高階函數,閉包隨便搞,很多新的函數式編程思想也可以比較舒服的用在golang中

  • 調試也不錯,可以用GDB,然後還有個效能測試工具也挺好,基本上這兩個再加上printf就能搞定幾乎所有的bug和效能瓶頸了。

壞的呢?

  • 記憶體回收應該算是個優點,讓你不用關心new了的對象什麼時候釋放,但作為一個老程式員,有些時候(其實是很多時候)你並不知道你的程式的記憶體空間是什麼樣子的,特別是一個搜尋引擎的開發,本來就吃記憶體,你還不確定記憶體用了多少,用在了什麼地方,還是很不爽的,不如自己new自己delete來得直接,雖然自己管理有可能有記憶體泄露,那改bug就好了,改到不泄露唄。當然,你可以說出一萬個有自動記憶體回收的語言的好處,但我也能說出一個自己管理記憶體的好處:自由。

  • 沒有泛型,沒有泛型,沒有泛型!無力吐槽。據說也不準備加。

  • 不支援動態載入.so,這個其實很重要,特別是不能停機的服務,比如搜尋引擎,如果可以動態載入.so,那修改演算法,修改策略,分分鐘上線而不用停服,不過好像1.6支援了?我沒關注過不知道,我現在用的還是1.4.2

總的來說,我還是非常非常推薦Golang的,下次有時間試試Rust,看看如何,不過我個人不太看好Rust,現在程式設計語言這麼多,還有PHP這種王牌語言,一個嶄新的語言後面沒有一個強大的公司支撐的話,最後不管多牛逼也只能呵呵。

最後,我的這個開源項目(https://github.com/wyh267/FalconEngine),我會堅持寫下去,變成一個分布式的搜尋引擎,希望在效能上能達到ES的水平吧,也歡迎大家關注,之前是為了熟悉搜尋引擎本身資料結構,所以自己擼了很多基礎代碼,後面為了能讓更多人用起來,也為了穩定性我會引入一些開源的組件而不是自己造輪子了。

想看之前所有文章,可以關注公眾號,然後點擊公眾號的菜單即可:)或者直接看SF的專欄也行。

歡迎關注我的公眾號,文章會在這裡首先發出來:)掃描或者搜尋號XJJ267或者搜尋中文西加加語言就行

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.