很早就想寫一系列的這樣的文章了,以前在一個電商公司作搜索,對搜索引擎有一些認識,來到一個新的創業公司之後很是高興還有機會繼續作這方面的事情,雖然領域已經變了,並且不是作搜索了,可是技術仍是那些技術,而且有機會接觸到了Go
語言,對於一個將近10年C/C++
的程序員來講,Go
的一些特質讓我以爲很是舒服,可參見我以前的這篇文章。git
從公司項目衍生出了一個本身的搜索引擎項目,而後有了這篇文章。程序員
先聊聊目標吧,我但願實現一個這樣的搜索引擎github
使用Go
語言實現,方便部署,最好就用一個二進制文件搞定一些,不須要安裝任何依賴。算法
相似一個電商的搜索引擎,支持多字段的檢索,不只僅是文本的全文索引,還須要包括過濾功能(好比價格區間過濾
),彙總功能(好比結果集中品牌數量彙總
),基本的統計功能。微信
索引器和搜索器在一塊兒,主要是爲了簡潔,不用啓多個實例。數據結構
支持創建多個索引,而且多個索引若是有主鍵關聯,能夠進行多索引的聯查(速度就只能呵呵了)。架構
對於1000萬的文檔,單個詞的平均查詢時間小於10ms。數據結構和算法
對於一臺8核8G內存的機器,QPS達到2000。分佈式
儘量的少用機器內存,在2G的機器上也能進行1000萬以上的文檔搜索。函數
有較強的擴展性,能夠本身擴展策略。
能夠進行分佈式的集羣部署,增長可搜索的文檔數量,提升系統的查詢吞吐量。
支持中文分詞,但分詞不是咱們的重點。
支持相關性排序,但相關性排序也不是咱們的重點。
重要的一點,因爲是對搜索引擎的一個全面實現,儘可能不用開源的代碼,全部算法和數據結構都本身實現,固然,也能夠方便的進行開源替代。
固然,一個搜索引擎涉及的部分實在是太多了,下面幾個部分不是咱們的重點,也不會進行深刻的實現
沒有爬蟲部分,搜索引擎的爬蟲又是一個另外的話題了,也能夠寫一個很複雜的系統出來,因此咱們這裏不涉及爬蟲的部分
不涉及算法的部分,所謂算法部分就是排序算法,各類相關度計算,這也是一個另外的話題了,等這一系列文章結束之後再來講說排序的算法,目前僅僅有的是按照TF*IDF進行基本的相關性的基本排序
不涉及分詞部分,分詞部分也是一個單獨的話題,直接實現了一個很是很是很是(重要事情說三遍)簡單的中文分詞器(一個函數),能夠用就好了。
目前代碼部分已經完成了一大半了,可是尚未進行優化,而且最後一個分佈式引擎尚未完成。可是代碼的核心部分,也就是搜索引擎自己的技術部分已經完成了,也已經在github
上託管了,因此這一系列文章出現不更新的狀況也不太可能,畢竟代碼已經基本完成了。
好了,下面咱們開始吧,整個系列文章將分紅如下幾個部分來進行描述
一個單機的搜索引擎的架構,包括搜索引擎的模塊組成,各個模塊的功能已經他們之間的關係,這個部分會對搜索引擎總體有個瞭解,方便後面的文章的詳細描述,這一部分可能會比較短,後面到第三部分會再詳細說。
搜索引擎的底層技術部分,這部分比較多的內容,會分開一個一個的講,包括倒排索引技術,正排索引技術,分詞算法,MMAP技術,這些是構成一個搜索引擎必要的底層技術,會在這一部分作介紹
一步一步的實現一個單機的搜索引擎,按照模塊從最底層的倒排和正排索引實現一直到最上層的引擎部分的實現,這一部分若是涉及到了相應的數據結構和算法也會單獨寫,好比哈希表算法,B+TREE算法,BitMap算法,有些我這個引擎中沒有實現的算法也會一塊兒講講,好比跳錶,前綴樹,布隆過濾器等等。
分佈式部分【TODO:須要等我代碼寫完了才行】,包括如何進行分佈式,各個機器之間若是進行同步,索引若是進行分片
代碼已經在git上開源了,我會本週再整理一下就公佈出來,目前就一堆代碼實在沒辦法看。
好了,算是開了一個頭了,文章的更新頻率會在一週3到5篇左右吧,歡迎你們掃描一下下面的微信公衆號訂閱,首先會在這裏發出來:)