分布式的存儲搜索一體化海量數據引擎:SF1R

jopen 10年前發布 | 18K 次閱讀 SF1R 分布式/云計算/大數據

什么是SF1R

SF1R是一個分布式的存儲搜索一體化海量數據引擎。SF1R來自于iZENECloud團隊多年的研發成果,并且已經在商業網站上經受住了嚴苛的考驗。2014年,iZENECloud團隊把SF1R 開放給社區,采用Apache License 2,希望共同改進和維護。

Note

SF1R的全稱是Search Formula 1 Revolution,SF1R是iZENECloud團隊給搜索引擎項目使用的內部代號。

SF1R的歷史和特色

SF1R是一個存在多年的項目,完全基于C++語言開發,最新的master分支已經可以用 C++ 11編譯。SF1R在早期開發時,參考了流行的Lucene的索引設計,并進行了若干改進,這里邊包括實時索引,以及更好的壓縮手段如PForDelta以及NewPFor。然而在使用過程中,我們發現Lucene這種完全基于文件的索引應對高并發和低延遲方面不具有優勢,鑒于絕大多數大規模搜索引擎的索引均完全放置于內存中,iZENECloud團隊又給SF1R添加了兩種索引Zambezi和Suffix,這2種索引均是業界最佳的設計,大大提升了SF1R的性能,在后邊將分別提到。iZENECloud團隊在根據需求不斷調整SF1R的過程中,給SF1R添加了眾多的功能,包括各種數據挖掘特性,以及集成了推薦引擎,使之成為一個龐大的搜索,存儲,推薦,挖掘一體化引擎,項目也因此變得臃腫不堪。因此,在2014年,iZENECloud團隊針對老版本的SF1R進行了大量裁剪,把不需要的數據挖掘,以及推薦引擎都從項目里刪除,只留下搜索和存儲,這就是SF1R-Lite項目,感興趣的朋友可以從提交歷史里恢復這些裁剪。

為什么采用SF1R

社區目前絕大多數應用都已經采用Lucene,以及基于Lucene的一系列搜索解決方案比如Solr 和ElasticSearch,這些搜索方案經過十多年很多人的改進,在通用化方面已經非常優秀。那么基于此,為什么還要再采用新的搜索方案呢? 這里邊有3個原因:首先,基于Java的搜索方案,在面臨高壓力場景時,由于GC的存在而時常有延遲抖動發生,SF1R在實際應用中,可以做到跑滿全部CPU(例如16核),并且7*24不間歇的運轉而沒有上述抖動;其次,SF1R采用的2種內存索引,在性能上遠高于常規方案,更能滿足對性能要求苛刻的應用,在實際應用中,SF1R曾經在單一節點上部署和索引了上億文檔,仍然提供快速響應;第三,SF1R是一個完整的服務端引擎,可以方便的對索引和其他功能進行擴展。相比Lucene社區的龐大代碼倉庫,SF1R的項目要精簡得多,因此更加便于針對特定場景進行修改和維護,這從SF1R支持3種索引結構就可以看出,此外,針對廣告檢索, SF1R也可以方便擴充第4種索引,這些都是傳統搜索解決方案Lucene不具備的。

Zambezi索引

Zambezi索引來自于 Zambezi 項目,索引的原理可以參考相關的論文,這是傳統倒排索引結構里的最佳設計之一,因為它可以做到在提供實時搜索的功能下不損失查詢性能,因此非常適合作為推ter或者微博搜索服務。在引入Zambezi 到SF1R的過程中,iZENECloud團隊又進行了若干改進,這里邊包含:原始Zambezi索引完全為推ter 類查詢服務,因此,對于不常見的詞(比如在少于128個文檔里出現),原始設計進行了剪枝,既無法在索引中搜索到。iZENECloud團隊的改進去掉了這種限制;此外,iZENECloud團隊還引入了一些最新的索引壓縮技術并且加以改進,比如 SIMD intersection ,使之具備最高速的解壓方案。

Suffix索引

Suffix索引采用了罕見的Succinct Self Index結構,基礎設施是Suffix Array和Wavelet Tree,具備完全不同于倒排索引的結構,相關的原理可以參見SF1R的技術報告。Suffix索引具備遠高于傳統索引的查詢性能,缺點是構建的時候需要占用大量內存,并且無法支持增量。

項目主頁:http://www.baiduhome.net/lib/view/home/1414814619872

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!