這一篇算給這一個系列告一個小的段落,以前開始寫這些文章的時候,只是想把本身最近用Golang寫的這個搜索引擎說一說,準備了大概3,4篇的量,可是一寫下來,發現有點收不住,寫到後面其實和Golang沒什麼關係了,主要在寫搜索引擎的架構和一些數據結構了,我以爲這比寫代碼註釋有用吧,並且經過這樣寫下來,我本身對這些個數據結構的理解也更深了。python
一個月的時間,寫了14篇了,雖然14篇文字不足以說明一個搜索引擎的實現,但我以爲基本上一些重要的東西我都說了,搜索引擎自己原理上其實比較簡單,而且咱們並無涉及搜索引擎爬蟲的部分,因此提及來並非很複雜,複雜是複雜在外圍一些算法上的東西,好比分詞,好比排序之類的。git
開了個頭之後,先說了一下搜索引擎的基本概念,包括docid
的概念,以及整個搜索引擎的分層狀況程序員
而後說了倒排索引技術,也是搜索引擎最最底層和核心的概念了。github
倒排索引分紅詞典和倒排文件兩部分,接着說了一下倒排索引的詞典的幾種實現方式,包括哈希表和B+樹的方式,而且簡單介紹了一下跳錶。golang
倒排索引技術說完了之後,按步驟的說了倒排索引的構建,包括全量和增量的構建,以及各類構建方式,最後說了一下個人構建方法。算法
倒排的原理,數據結構,構建方式介紹完了之後花了一篇介紹了一下正排索引。編程
倒排和正排兩個基礎數據結構說完了之後說了索引的分段策略,分段是爲了更靈活的使用索引而出現的一種技術。設計模式
段以後就是索引層了,索引層先說了數據如何進行增刪改。微信
最後介紹了一下數據的檢索,包括一些求交集,求並集的過程,這一篇實際上就是索引層之上的引擎層作的事了。數據結構
而後除了上面這些,穿插的說了一下搜索引擎的一些外圍的技術,包括文本相關性,排序,機器學習和長尾詞的一些問題。
照這樣,第一部分應該差很少能夠結束了,一個單機版的搜索引擎只須要上面一些東西就能夠完整的實現了,也歡迎你們去個人github上看看,目前開源出來的就是一個簡單的單機版的搜索引擎了,主要的結構以下,很簡單的,歡迎提交bug,因爲是本身的玩具項目,沒有寫單元測試,代碼中的_test.go文件都是功能測試。
可是,這個系列也遠沒結束,關於搜索引擎還有好多能夠說的,而且索引分片和分佈式都還沒開始呢,只是第一部分的單機版的結束了,後面會用一個系列說一下搜索引擎的分佈式實現,固然代碼也會跟着更新。
後面的文章更新仍是會圍着搜索,推薦和廣告這三個方面來講,我以爲這三個實際上是一體的,用的技術也差很少,算法上三個看上去有區別,其實底層也差不太多,特別是廣告,簡直就是推薦+搜索的組合,因此文章在架構和算法上也都會涉及到,固然也會有比較扯淡的文章,好比今天這篇。
用了快一年的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或者搜索中文西加加語言就行