第零部分咱們已經列了一個提綱了,這一篇文章開始要詳細說說了。git
在說搜索引擎架構分層以前,咱們先肯定幾個搜索引擎的概念。github
文檔
,搜索引擎的基本數據單元,好比一張網頁,一個商品,多個文檔合在一塊兒就是一個搜索引擎的完整數據算法
倒排索引
,正排索引
,存儲在搜索引擎內部的數據結構,也是搜索引擎最底層的數據結構。數據庫
索引器
,將文檔
數據生成可供搜索的倒排索引
和正排索引
的程序就是索引器。json
檢索器
,經過對倒排索引
和正排索引
進行查找,從而查找到文檔
的程序。數組
字段
,每一個文檔可能有多個字段,好比一篇文章有標題,做者,摘要,詳情,發佈時間的,這些東西雖然在一個文檔
中,可是搜索的時候須要區別對待。服務器
索引
,多個文檔
經過索引器
生成了一堆倒排正排索引,咱們把這些倒排正排索引的集合叫索引
,若是後面提到索引
就是指正排和倒排索引的集合,索引也能夠理解爲數據庫中的表。微信
好了,上面就是搜索引擎的最基本的概念,搜索引擎簡單的說分紅兩部分,一部分就是索引器
把文檔變成倒排
和正排
文件,第二部分就是檢索器
經過倒排
和正排
文件還原文檔
的過程。網絡
數據庫其實也是一個搜索引擎,只是數據庫和搜索引擎的側重點不太同樣,搜索引擎追求的是簡單,速度快,而數據庫追求的是穩定和複雜邏輯對數據的處理,因此應用場景不太同樣。數據結構
既然知道了一個搜索引擎的基本概念,應該怎麼來設計這個搜索引擎呢?
按照通常的軟件設計邏輯,若是不是很是複雜的系統,要設計一個系統,首先要設計數據結構,而後把數據結構封裝到各個算法和類中,而後將各個類組合起來就完成了,因此,我設計這個引擎,是基於如下幾個層次來的。
首先須要一個底層的數據層,用來存儲倒排索引
和正排索引
,每一個字段都會創建相應的倒排和正排索引,這一部分應該有一系列相關的模塊來實現;
全部字段的倒排索引
和正排索引
合起來就是整個數據文件,而後須要一些模塊來對這些東西進行管理;
而後因爲在第一篇文章中咱們說了但願索引器
和檢索器
都在這裏,相似ElasticSearch
的實現,因此也使用了分段的方式管理文檔的索引
,每到必定的條件下將索引
刷新到磁盤或者將索引合併起來。
咱們還須要一個引擎的東西來管理多個索引
,引擎負責複雜的查詢策略和排序策略,這個引擎是能夠更換和修改了,只須要實現標準接口就行,也能夠本身實現來替換默認的引擎達到更多的功能,甚至你能本身寫一個引擎,實現SQL查詢。
最後還須要一個和外界交互的層,我實現的是一個http服務器來和外部交互,交互的數據經過json
來進行,這一層也能夠重寫成任何你須要的樣子。
按照上面這些個模塊,一個搜索引擎,在總體架構上大約分紅如下幾個層次
首先,最底層的是數據模塊層,負責引擎內全部的數據描述,對於搜索引擎來講,數據分爲倒排索引
和正排索引
,也叫逆向索引
和正向索引
,爲了方便,咱們這統一叫倒排索引
和正排索引
。
在這一層之上是字段層,每個字段對應了一個正排索引和一個倒排索引(可選),由於有些字段只須要展現出來而不須要進行搜索是不須要倒排的。
在字段層以前有個段的層來對這些字段進行管理,段有的在內存中,有的刷新到磁盤上了。
段層之上就是索引模塊層了,這一層對上提供一些基本的增長,刪除,修改,查找的接口。
索引模塊層之上是引擎層,這一層實現具體的業務查找邏輯。
最上面是一個網絡層,負責和外界進行交互。
在實現的時候,爲了儘可能簡單,每一個模塊基本上都是一個文件來實現的,用了Golang
之後,代碼寫起來也自由起來了,只要清晰就行,因此整個引擎下來,代碼量其實不是很大。
下面這個圖就是整個代碼的大框架圖,後面咱們會一個一個的來說這些東西。
經過這一篇文章,但願能對搜索引擎有個初步的瞭解了,後面我會一個一個模塊一個一個技術點的來拆分一下這個搜索引擎。
接下來的文章會開始介紹搜索引擎的底層技術了,倒排索引【會花比較多精力來講倒排索引,畢竟這是核心的核心】,正排索引【這個簡單,就是數組】,在介紹的時候會有幾篇文章介紹實現倒排索引技術須要的一些算法和數據結構。
代碼託管在github
上,地址是https://github.com/wyh267/FalconEngine,代碼還在不斷更新中,目前代碼量,去掉單元測試文件,大約是6000行,由於是想到哪寫到哪,有些函數也沒有用,因此還有優化空間,也但願你們提交你的patch,後面講的時候能夠對照代碼看看。
代碼結構以下,再說一遍,代碼量不大,結構也很是簡單,雖然我寫的代碼註釋很少,可是沒有使用任何高級功能,閉包都沒有,直接看沒任何難度。
文章的更新頻率會在一週3到5篇左右吧,歡迎你們掃描一下下面的微信公衆號訂閱,首先會在這裏發出來:)