bleve是一個全文搜索引擎,golang里對標(biāo)java的lucene,但是在結(jié)果封裝等方面又借鑒了Elasticsearch很多設(shè)計,不得不說,不背負(fù)歷史包袱更方便撥絲抽繭。
本章開始我們嘗試分析bleve的源碼,個人是不喜歡讀他人源碼的,1.思想受限。2.破壞自己的風(fēng)格。當(dāng)然最主要的是讀代碼比寫代碼難 -_-! . 如果你能很好很快的hold住一份復(fù)雜代碼,你的功底至少比作者高出1個level才實(shí)際。不過這不影響咱們讀代碼。懂不懂不重要,重要的是讀沒讀是吧哈哈。
廢話不多說了,直接上一個圖,然后嫖一下官網(wǎng)文檔,本章交差
上圖是bleve的目錄結(jié)構(gòu)。golang有著喪心病狂的包引用潔癖,所以go語言的程序分層相當(dāng)講究自上而下,這樣也很方便閱讀。
bleve
是top-level 的package,他的存在是更好的調(diào)用,包裝下層package。
Analysis
分析器的包,將文本打成term,這個我比較熟,這個包一般不會調(diào)用其他包里面的內(nèi)容,比較獨(dú)立.
Analyzers
analyzers 就是一個完整的分詞器,順路插一句,bleve的分詞器插件比起lucene相對簡單不少,一個analyzers里面一般有一個Tokenizer,用于詞語片段化,多個TokenFilter。用于過濾轉(zhuǎn)換。
ByteArrayConverters
故名思議,byte數(shù)組轉(zhuǎn)換,好吧我實(shí)話實(shí)說,寫這個文章的此時此刻,我還沒看過代碼這么細(xì)的地方。so我感覺不到這個玩意的存在。
DateTime Parsers
時間日期的解析
Language
這個包實(shí)現(xiàn)了多種語言的分析器,but沒有中文的,lucene里面包了一個smartcn的分詞器,話說中文分詞器依賴詞典模型,反而還是以插件的形式比較穩(wěn)妥。對于我來說一個standard一個keywords分詞器就可以隨便浪了,不在乎。
Token Filters
詞干抽取的過濾器,停用詞呀啥的。
CharFilters
字符過濾,沒什么好說的,寫轉(zhuǎn)換,全半角轉(zhuǎn)換,啥的。
Token Maps
不知何物,貌似從一個文件讀取一個詞或短語,還吃了bool表達(dá)式。
Tokenizers
分詞器,你如果自己寫分詞器主要是寫這里
Document
文檔包包含與bleve文檔和字段相關(guān)的代碼。一個文檔包含多個字段,一個字段包含多個term。這是bleve中的索引單元。
Index
index包是將索引數(shù)據(jù)寫入到磁盤的功能。方便search。
Store
存儲包,是一個文檔持久化的工具包,實(shí)現(xiàn)了kv接口,可以掛載多個kv數(shù)據(jù)庫。如leveldb rockdb啥的。
upside_down
upside_down包是倒排索引實(shí)現(xiàn)。它可以使用任何存儲實(shí)現(xiàn)。它包含關(guān)于如何編碼單個行的所有細(xì)節(jié)。
HTTP
一個簡易的api服務(wù),作者的意思是是可用可不用。json協(xié)議。
Registry
通過名稱提供一些注冊服務(wù),類似cache。比如分詞器等,應(yīng)該算是一種設(shè)計模式吧。這還有助于序列化索引映射并將它們與索引一起持久化。
Search
搜索包的代碼主要是實(shí)現(xiàn)搜索方法,這個包依賴index包的接口,然后就不依賴其他了。
Collectors
收集器包負(fù)責(zé)從所有結(jié)果中收集所需的結(jié)果并打分。用堆排序,選取topN,
Facets
負(fù)責(zé)從結(jié)果集中收集數(shù)據(jù),然后構(gòu)建
Highlight
高亮包,負(fù)責(zé)在返回結(jié)果中命中高亮文本。沒什么好說的
Scorers
Scorers 負(fù)責(zé)堆搜索結(jié)果打分,這個打分可能是中間結(jié)果,Collectors來調(diào)用,
Searchers
這個包里面包含了實(shí)際的搜索實(shí)現(xiàn)。后面爭取我們可以細(xì)致分析
Utils
這個包包含了所有的命令行實(shí)現(xiàn),在新版本里面是cmd包。
實(shí)際上你能發(fā)現(xiàn),目前包結(jié)構(gòu)和當(dāng)前這份文檔對不上了。打開時光機(jī)回到項(xiàng)目初生的時候看看
果然這老頭已變初心