用Golang寫一個搜索引擎(0x00) --- 從零開始
時間:2023-03-17 02:12:01 | 來源:電子商務(wù)
時間:2023-03-17 02:12:01 來源:電子商務(wù)
本站終于給我開專欄了,聽說這里人群高端:)
這篇是引子,如果你感興趣這個話題,感興趣自己來寫一個搜索引擎,這里有全部文章
用Golang寫一個搜索引擎(0x00)從零開始
用Golang寫一個搜索引擎(0x01)基本概念
用Golang寫一個搜索引擎(0x02)倒排索引技術(shù)
用Golang寫一個搜索引擎(0x03)跳躍表,哈希表
用Golang寫一個搜索引擎(0x04)B+樹
用Golang寫一個搜索引擎(0x06)索引構(gòu)建
用Golang寫一個搜索引擎(0x07)正排索引
用Golang寫一個搜索引擎(0x08)索引的段
用Golang寫一個搜索引擎(0x09)數(shù)據(jù)增刪改
很早就想寫一系列的這樣的文章了,之前在一個電商公司做搜索,對搜索引擎有一些認(rèn)識,來到一個新的創(chuàng)業(yè)公司以后非常高興還有機(jī)會繼續(xù)做這方面的事情,雖然領(lǐng)域已經(jīng)變了,而且不是做搜索了,但是技術(shù)還是那些技術(shù),并且有機(jī)會接觸到了Go語言,對于一個將近10年C/C++的程序員來說,Go的一些特質(zhì)讓我覺得非常舒服,可參見我之前的文章,點(diǎn)擊下面的閱讀原文可以看到。
從公司項(xiàng)目衍生出了一個自己的搜索引擎項(xiàng)目,然后有了這篇文章。
先聊聊目標(biāo)吧,我希望實(shí)現(xiàn)一個這樣的搜索引擎- 使用Go語言實(shí)現(xiàn),方便部署,最好就用一個二進(jìn)制文件搞定一些,不需要安裝任何依賴。
- 類似一個電商的搜索引擎,支持多字段的檢索,不僅僅是文本的全文索引,還需要包括過濾功能(比如價格區(qū)間過濾),匯總功能(比如結(jié)果集中品牌數(shù)量匯總),基本的統(tǒng)計(jì)功能。
- 索引器和搜索器在一起,主要是為了簡潔,不用啟多個實(shí)例。
- 支持建立多個索引,并且多個索引如果有主鍵關(guān)聯(lián),可以進(jìn)行多索引的聯(lián)查(速度就只能呵呵了)。
- 對于1000萬的文檔,單個詞的平均查詢時間小于10ms。
- 對于一臺8核8G內(nèi)存的機(jī)器,QPS達(dá)到2000。
- 盡可能的少用機(jī)器內(nèi)存,在2G的機(jī)器上也能進(jìn)行1000萬以上的文檔搜索。
- 有較強(qiáng)的擴(kuò)展性,可以自己擴(kuò)展策略。
- 可以進(jìn)行分布式的集群部署,增加可搜索的文檔數(shù)量,提高系統(tǒng)的查詢吞吐量。
- 支持中文分詞,但分詞不是我們的重點(diǎn)。
- 支持相關(guān)性排序,但相關(guān)性排序也不是我們的重點(diǎn)。
- 重要的一點(diǎn),由于是對搜索引擎的一個全面實(shí)現(xiàn),盡量不用開源的代碼,所有算法和數(shù)據(jù)結(jié)構(gòu)都自己實(shí)現(xiàn),當(dāng)然,也可以方便的進(jìn)行開源替代。
當(dāng)然,一個搜索引擎涉及的部分實(shí)在是太多了,下面幾個部分不是我們的重點(diǎn),也不會進(jìn)行深入的實(shí)現(xiàn)- 沒有爬蟲部分,搜索引擎的爬蟲又是一個另外的話題了,也可以寫一個很復(fù)雜的系統(tǒng)出來,所以我們這里不涉及爬蟲的部分
- 不涉及算法的部分,所謂算法部分就是排序算法,各種相關(guān)度計(jì)算,這也是一個另外的話題了,等這一系列文章結(jié)束以后再來說說排序的算法,目前僅僅有的是按照TF*IDF進(jìn)行基本的相關(guān)性的基本排序
- 不涉及分詞部分,分詞部分也是一個單獨(dú)的話題,直接實(shí)現(xiàn)了一個非常非常非常(重要事情說三遍)簡單的中文分詞器(一個函數(shù)),可以用就行了。
目前代碼部分已經(jīng)完成了一大半了,但是還沒有進(jìn)行優(yōu)化,并且最后一個分布式引擎還沒有完成。但是代碼的核心部分,也就是搜索引擎本身的技術(shù)部分已經(jīng)完成了,也已經(jīng)在github上托管了,所以這一系列文章出現(xiàn)不更新的情況也不太可能,畢竟代碼已經(jīng)基本完成了。
整個系列文章將分成以下幾個部分來進(jìn)行描述- 一個單機(jī)的搜索引擎的架構(gòu),包括搜索引擎的模塊組成,各個模塊的功能已經(jīng)他們之間的關(guān)系,這個部分會對搜索引擎整體有個了解,方便后面的文章的詳細(xì)描述,這一部分可能會比較短,后面到第三部分會再詳細(xì)說。
- 搜索引擎的底層技術(shù)部分,這部分比較多的內(nèi)容,會分開一個一個的講,包括倒排索引技術(shù),正排索引技術(shù),分詞算法,MMAP技術(shù),這些是構(gòu)成一個搜索引擎必要的底層技術(shù),會在這一部分做介紹
- 一步一步的實(shí)現(xiàn)一個單機(jī)的搜索引擎,按照模塊從最底層的倒排和正排索引實(shí)現(xiàn)一直到最上層的引擎部分的實(shí)現(xiàn),這一部分如果涉及到了相應(yīng)的數(shù)據(jù)結(jié)構(gòu)和算法也會單獨(dú)寫,比如哈希表算法,B+TREE算法,BitMap算法,有些我這個引擎中沒有實(shí)現(xiàn)的算法也會一起講講,比如跳表,前綴樹,布隆過濾器等等。
- 分布式部分【TODO:需要等我代碼寫完了才行】,包括如何進(jìn)行分布式,各個機(jī)器之間如果進(jìn)行同步,索引如果進(jìn)行分片
代碼已經(jīng)在git上開源了,我會本周再整理一下就公布出來,目前就一堆代碼實(shí)在沒辦法看。
好了,算是開了一個頭了,如果想在微信上看,可以微信搜索
XJJ267或者
西加加語言,那里還有其他類型的文章。