日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

深入搜索引擎原理 搜索引擎其實也是一個什么系統(tǒng)( 六 )

  • 每次文件只會被合并到上一層的一個文件 。當一層的文件數(shù)滿足特定個數(shù)時,合并到上一層 。
  • 所以,LSM 是日志和傳統(tǒng)的單文件索引(B+ tree,Hash Index)的中立,他提供一個機制來管理更小的獨立的索引文件(sstable) 。
    通過管理一組索引文件而不是單一的索引文件,LSM 將B+樹等結(jié)構(gòu)昂貴的隨機IO變的更快,而代價就是讀操作要處理大量的索引文件(sstable)而不是一個,另外還是一些IO被合并操作消耗 。
    Lucene的Segment設計思想,與LSM類似但又有些不同,繼承了LSM中數(shù)據(jù)寫入的優(yōu)點,但是在查詢上只能提供近實時而非實時查詢 。
    Segment在被flush或commit之前,數(shù)據(jù)保存在內(nèi)存中,是不可被搜索的,這也就是為什么Lucene被稱為提供近實時而非實時查詢的原因 。讀了它的代碼后,發(fā)現(xiàn)它并不是不能實現(xiàn)數(shù)據(jù)寫入即可查,只是實現(xiàn)起來比較復雜 。原因是Lucene中數(shù)據(jù)搜索依賴構(gòu)建的索引(例如倒排依賴Term Dictionary),Lucene中對數(shù)據(jù)索引的構(gòu)建會在Segment flush時,而非實時構(gòu)建,目的是為了構(gòu)建最高效索引 。當然它可引入另外一套索引機制,在數(shù)據(jù)實時寫入時即構(gòu)建,但這套索引實現(xiàn)會與當前Segment內(nèi)索引不同,需要引入額外的寫入時索引以及另外一套查詢機制,有一定復雜度 。
    FST數(shù)據(jù)字典 Term Dictionary,通常要從數(shù)據(jù)字典找到指定的詞的方法是,將所有詞排序,用二分查找即可 。這種方式的時間復雜度是 Log(N),占用空間大小是 O(N*len(term)) 。缺點是消耗內(nèi)存,存在完整的term,當 term 數(shù)達到上千萬時,占用內(nèi)存非常大 。
    lucene從4開始大量使用的數(shù)據(jù)結(jié)構(gòu)是FST(Finite State Transducer) 。FST有兩個優(yōu)點:
    1. 空間占用小,通過讀 term 拆分復用及前綴和后綴的重用,壓縮了存儲空間;
    2. 查詢速度快,查詢僅有 O(len(term)) 時間復雜度
    那么 FST 數(shù)據(jù)結(jié)構(gòu)是什么原理呢? 先來看看什么是 FSM (Finite State Machine),有限狀態(tài)機,從“起始狀態(tài)”到“終止狀態(tài)”,可接受一個字符后,自循環(huán)或轉(zhuǎn)移到下一個狀態(tài) 。
    而FST呢,就是一種特殊的 FSM,在 Lucene 中用來實現(xiàn)字典查找功能(NLP中還可以做轉(zhuǎn)換功能),F(xiàn)ST 可以表示成FST的形式
    舉例:對“cat”、 “deep”、 “do”、 “dog” 、“dogs” 這5個單詞構(gòu)建FST(注:必須已排序),結(jié)構(gòu)如下:
    深入搜索引擎原理 搜索引擎其實也是一個什么系統(tǒng)


    當存在 value 為對應的 docId 時,如 cat/0 deep/1 do/2 dog/3 dogs/4,F(xiàn)ST 結(jié)構(gòu)圖如下:
    深入搜索引擎原理 搜索引擎其實也是一個什么系統(tǒng)


    FST 還有一個特點,就是在前綴公用的基礎上,還會做一個后綴公用,目標同樣是為了壓縮存儲空間 。
    其中紅色的弧線表 NEXT-optimized,可以通過 畫圖工具 來測試 。
    SkipList為了能夠快速查找docid,lucene采用了SkipList這一數(shù)據(jù)結(jié)構(gòu) 。SkipList有以下幾個特征:
    1. 元素排序的,對應到我們的倒排鏈,lucene是按照docid進行排序,從小到大;
    2. 跳躍有一個固定的間隔,這個是需要建立SkipList的時候指定好,例如下圖以間隔是;
    3. SkipList的層次,這個是指整個SkipList有幾層

    深入搜索引擎原理 搜索引擎其實也是一個什么系統(tǒng)


    在什么位置設置跳表指針?
    ? 設置較多的指針,較短的步長,更多的跳躍機會
    ? 更多的指針比較次數(shù)和更多的存儲空間
    ? 設置較少的指針,較少的指針比較次數(shù),但是需要設置較長的步長?較少的連續(xù)跳躍
    如果倒排表的長度是L,那么在每隔一個步長S處均勻放置跳表指針 。

    推薦閱讀