搜尋之倒排索引

2021-08-07 03:24:31 字數 2602 閱讀 8286

搜尋引擎最核心的技術,倒排索引技術,倒排索引可能需要分成幾篇文章才說得完,我們先會說說倒排索引的技術原理,然後會講講怎麼用一些資料結構和演算法來實現乙個倒排索引,然後會說乙個索引器怎麼通過文件來生成乙個倒排索引。什麼是倒排索引呢?索引我們都知道,就是為了能更快的找到文件的資料結構,比如給文件編個號,那麼通過這個號就可以很快的找到某一篇文件,而倒排索引不是根據文件編號,而是通過文件中的某些個詞而找到文件的索引結構。

我們看個例子,有下面的幾個文件:

文件編號

文件內容

1這是乙個go語言實現的搜尋引擎

2php是世界上最好的語言

3linux是c語言和組合語言實現的

4谷歌是乙個世界上最好的搜尋引擎公司

文件編號go1

語言1,2,3

實現1,3

搜尋引擎

1,4php2世界

2,4最好

2,4彙編3公司

4 1.我們在**2中查到搜尋引擎這個詞出現在第4行

2.找到第4行的第2列,把文件編號找出來,是1和4

3.去第乙個**通過文件編號把每個文件的實際內容找出來

4.將1和4的結果顯示出來

5.搜尋完成

上面就是搜尋引擎的最基礎的技術了,如果來設計乙個資料結構和演算法來實現表2就成了搜尋引擎技術的關鍵。

在實現資料結構和演算法之前,我們需要知道搜尋引擎搜尋的是海量的資料,一般的中型電商的資料都是幾十上百g的資料了,所以這個資料結構應該是儲存在本地磁碟的而不是在記憶體中的,基於以上的考慮,為了快速搜尋,要麼自己實現cache來快取熱資料,要麼考慮使用作業系統的底層技術mmap,鑑於我自己實現的cache不見得(基本上是不太可能)比作業系統做得好,所以我使用的是mmap

mmap系統呼叫

mmap是將乙個檔案或者其它物件對映進記憶體。檔案被對映到多個頁上,如果檔案的大小不是所有頁的大小之和,最後乙個頁不被使用的空間將會清零。實現這樣的對映關係後,程序就可以採用指標的方式讀寫操作這一段記憶體,而系統會自動回寫髒頁面到對應的檔案磁碟上,即完成了對檔案的操作而不必再呼叫read,write等系統呼叫函式。

mmap最大的乙個好處是作業系統會自己將磁碟上的檔案對映到記憶體,當記憶體足夠的時候,操作檔案就像操作記憶體一樣快,而當記憶體不足的時候,作業系統又會自己將一些頁從記憶體中去掉,實現了乙個類似快取的東西。特別適合於對於巨大檔案的讀操作,而我們的倒排索引檔案就是這種巨大的檔案,而且基本上寫入一次以後就不太修改了,每次查詢都讀操作,所以使用mmap是乙個比較好的選擇。

標頭檔案

函式原型

voidmmap(void start,size_t length,int prot,int flags,int fd,off_t offset);

乙個巨大的檔案mmap之後,檔案讀寫操作的效能由系統記憶體決定,系統可用記憶體越大,那麼讀寫檔案的效能越好,因為作業系統的記憶體足夠,系統會將更多的檔案載入到記憶體,提高系統吞吐量。

在go語言中,對應的mmap呼叫是:(需要引入syscall包)

func mmap(fd int, offset int64, length int, prot int, flags int) (data byte, err error)

引數分別是:檔案描述符,偏移量,需要對映的長度,期望的記憶體保護標誌【是唯讀還是只寫還是讀寫】,對映方式【是否同步到檔案,還是只是副本修改等】。

因為mmap是基礎實現,很多地方都需要使用,所以單獨實現了乙個mmap的類,在utils.mmap中,提供一些基礎的方法:

func newmmap(file_name string, mode int) (*mmap, error) 新建乙個mmap

func (this *mmap) readint64(start int64) int64 //從指定位置讀取乙個int64的值

func (this *mmap) writeint64(start, value int64) error //在指定位置寫入乙個int64的值

func (this *mmap) readdocidsarry(start, len uint64) docidnode //從指定位置讀取乙個docid的鏈

......

巨大檔案的讀寫技術方案解決了,實際上主要就是解決了表2的第二列的問題,在乙個擁有巨大文件數的資料中,表2的第二列占用了絕大多數磁碟空間,我們會將表2分成兩個資料結構來儲存,第二列就是乙個連續的儲存檔案,叫倒排檔案,在上述例子中,我們會將第二列存成:

11,2,3

1,31,4

22,4

2,434

而第一列我們將儲存關鍵字和偏移量。這樣,表2就被我們拆分成兩個資料結構了,現在的關鍵是第一列使用什麼資料結構可以保證在查詢的時候迅速找到對應的關鍵字,從而找到偏移量得到第二列的具體資料。

好了,現在有幾位選手要上場,他們都可以實現第一列的結構,他們分別是:順序表雜湊表查詢樹字首樹

搜尋引擎概述之倒排索引

考慮一下未來個人使用的裝置,它將是乙個機械化的個人圖書館,它需要乙個名字引起人們的注意 memex 就可以.memex是這樣乙個機械化裝置,人們可以在其中儲存書籍 記錄和信件,同時可以以很高的速度和極強的靈活性完成檢索.作為輔助裝置,它是人腦的無限擴大.bush,1945 說到提高檢索效率,就必然提...

搜尋引擎 倒排索引

本節通過引入簡單例項,介紹與搜尋引擎索引有關的一些基礎概念,了解這些基礎概念對於後續深入了解索引的工作機制非常重要。3.1.1單詞 文件矩陣 單詞 文件矩陣是表達兩者之間所具有的一種包含關係的概念模型,圖3 1展示了其含義。圖3 1的每列代表乙個文件,每行代表乙個單詞,打對勾的位置代表包含關係。圖3...

搜尋引擎 倒排索引

倒排索引基本概念示意圖 假設文件集合包含五個文件,每個文件內容如圖3 3所示,在圖中最左端一欄是每個文件對應的文件編號。我們的任務就是對這個文件集合建立倒排索引。文件集合 需要對每個單詞賦予唯一的單詞編號,同時記錄哪些文當包含這些單詞,如下就是乙個簡單的索引,單詞id記錄了每個單詞的單詞編號,第二欄...