Everything Search Engine這款軟體如何做到如此快速的搜尋的?

時間 2022-01-22 04:10:44

1樓:奔波兒灞

嗯,剛好本人曾經是這款軟體的第一作者,效能確實和everything有差距,但是七七八八的原理還是能說得清楚,就隨便說說吧.

實現everything,大概有幾步吧.

1. 建立檔名的索引庫.

這個的實現可以使用NTFS的USN機制來做,當然也可以使用FindFirstFile 這些Api來實現.

對於每個檔案,可以構建乙個如下的結構,

仔細看這個結構,其實最後可以實現乙個類似B+樹的樹狀結構,可以從某碟符的根目錄,遍歷所有子檔案. 這個FileEntry也可以通過parent指標往上回溯,可以獲得全路徑.其實第一步是所有實現中最簡單的,上面所有的答案,都只回答了這一點.

2. 實現檔案的快速搜尋,並顯示在UI上.

其實搜尋才是這部分最難的,乙個是everything要支援正規表示式,你要正確的解析所有的萬用字元,包括 *,? 等等,要支援對字尾名字的判斷,解析成功之後呢,要使用正確的字元搜尋演算法去匹配. 常見的演算法 KMP, BM 等等,都可以.

(Bla Bla 省略一千字)

比如你搜尋 "123*" "12*3" "*123" 這些的解析都不竟相同.

然後通過字元匹配演算法,獲得乙個乙個符合該條件的 FileEntry. 然後再丟擲這個結果.

丟擲之後呢,可能符合結構的有很多,你要在介面上重新整理和顯示出來,做得不好的,介面顯示會卡頓.等等.

3. 實現對所有磁碟檔案變化的監測.

你看到everything,可以在你複製乙個檔案之後,又在everything搜尋列表內馬上顯示出來. 其實是everything本身會建立好幾個執行緒,去監視所有磁碟的USN變化. 變化包括檔案的增刪重新命名等.

這個時候everything就要實時更新自己的檔案索引庫.

當然對於不支援USN變化的FAT32磁碟就沒有辦法了? 辦法還是有的,有個叫ReadDirectoryChangW的函式,一樣可以監視磁碟的變化,一樣可以實現檔案索引的更新.

總結: 其實呢,原理大概就這樣,第一點誰都能說,第二和第三點做得好的,很少.

回答題主的乙個問題,為啥微軟不去做乙個everything:

Windows設計本身的目的不是為了去做某款特定的產品,而是為廣大的使用者提供乙個通用使用的東西. 他要去權衡效能,全球使用者的接受程度等等. 他提供介面,給開發人員去想象去實現,要知道微軟要做的是平台和生態圈這個概念,你就能理解了.

2樓:robinh00d

支援最高的答案寫了一大堆,可惜是錯的。

EVERYTHING不是靠遍歷MFT的,遍歷MFT木有那麼快。

everything是靠遍歷USN journal+同時建立索引。本人N年前曾經實現過乙個類EVERYTHING的東東。

簡而言之:建立索引快是因為遍歷USN JOURNAL,搜尋快是因為建立了索引。

通過遍歷MFT/FIND API函式來建立索引,速度都比較慢,在秒級是無法完成的。

具體細節已由 @coltor說明。

----

補充,只能說知乎上有些人對技術不了解只憑主觀想象就敢洋洋灑灑寫一大篇文字,實在佩服。

3樓:

Everything是我嚴重依賴的乙個軟體,來答一答。

Everything和Windows搜尋是有區別的,以下列幾點:

1. Everything只能搜尋檔名和資料夾名,Windows搜尋可以搜尋檔名和檔案內容;

2. Everything只能搜尋NTFS格式的檔案系統,Windows搜尋可以搜尋任意檔案系統(例如FAT32,exFAT,NTFS);

但有時我們需要的恰好就是快速搜尋檔名,那麼Everything的工作原理是如何呢?

先簡單介紹一下NTFS的兩個功能,MFT和USN journal。

Master File Table (MTF)

在NTFS檔案系統中,有乙個特殊的表,稱為MTF表。所有資料夾和檔案的名稱都被儲存在該表中,訪問該錶的速度非常快,使應用程式可以不遍歷檔案系統就能獲取當前卷(磁碟)中的所有檔案的名稱和路徑。

USN journal

NTFS還有乙個日誌功能。所有對檔案系統有修改的操作都被記錄在了乙個journal日誌檔案中。

Everything的原理

程式啟動時,掃瞄系統所有NTFS卷(磁碟)的MTF表,將檔名稱以一種利於字串檢索的演算法形式儲存在Everything的index索引資料庫中。

系統執行過程中,Everything還會監控NTFS卷的journal日誌檔案,如果檔案系統中的檔案發生改變,Everything會更新它的index索引資料庫。

當使用者搜尋檔案時,Everything利用字串查詢演算法,在index索引資料庫中查詢,可以直接搜尋到檔案。

那麼,現在回答題主問題。

Q:Search Everything 這款軟體如何做到如此快速的搜尋的?

A:因為Everything在搜尋時,根本沒有遍歷檔案系統,它檢索的是自己組織好的索引資料庫,因此搜尋速度飛快;

Q:Windows搜尋時什麼原理?

A:Windows搜尋用的是普通的檔案系統遍歷查詢。用的應該是標準WIN32 API,例如FindFirstFile/FindNextFile之類。

當然,Windows7之後的版本現在已經內建帶索引的搜尋功能,這項功能非常複雜,不僅可以搜尋檔名,還可以搜尋檔案內容,而且適用任意檔案系統。但缺點就是需要乙個後台服務爬蟲不停的對檔案系統進行索引,比較耗資源。

Q:為何微軟不使用這種原理?

A:個人覺得是因為這種方法不具備普適性,無法應用與非NTFS檔案系統,所以無法整合到Windows中。

Q:為何微軟不收購這家公司?

A: 個人感覺還是技術含量不太高,而且微軟自家的ActiveDirectory早就在使用MTF快速檢索檔案了。

4樓:Cascade

Everything直接訪問了NTFS分割槽的檔案日誌,同時構造索引。本質上和你自己讀乙個檔案,對這檔案構造索引再搜尋內容一樣,所以速度異常的快。

但該操作需要很高的磁碟訪問許可權,所以這個軟體需要管理員許可權才能正常執行。對於一般的Windows使用者,根本不知道許可權管理是什麼,隨便就給自己弄成管理員,然後關掉UAC。然後經常受到惡意軟體襲擊,再去抱怨Windows不安全。

Windows的搜尋功能只是單純的訪問檔案,因此沒有許可權的問題。

在Windows裡,你可以建立檔案索引。在控制面板內搜尋「索引」二字,開啟索引選項。把你想要建立索引的位置新增進去。

或者開啟想索引的資料夾,隨便搜點什麼。Windows會問你是否建立索引。

建立索引不僅能以極快的速度搜尋檔名,同時還能搜尋檔案內容。方法是在分割槽上點右鍵->屬性->選上「除檔案屬性外,還允許索引此驅動器上的檔案內容。」

Git commits歷史是如何做到如此清爽的?

汪志成 Angular開發組有乙個很明確的commit規範,包括英語語法要求之類的都給你講清楚了,不想研究的話直接follow就行了。至於時間線方面,rebase已經是常規的開發習慣了,只是有些場合有坑,坑不多,自己用用,避開就是了。 程墨Morgan 要求功能分支進入master branch必須...

這款96kb大小的FPS遊戲是如何做到的?

之前知乎已經有相當漂亮的回答的,題主應該問之前先查一下。答案在這裡 https www. 孫林 這些基本的可以呼叫DIRECTX 演算法生成。雖然只有96K,但是需要DIRECT 9支援的。就像有的魔獸地圖才幾十K。 飛翔的蝸牛 3D的網格資料有兩種儲存方式。一種是用3DMAX類軟體編輯好,放在硬碟...

明星是如何做到如此高強度的練習的?

可能是豬吧 張藝興的嚴格,對練習生的不滿意,都說明他經歷的,承受的,要比那些練習生多得多 不為別的,自己選的路跪著也要走完,為自己驕傲 XXX 明星也不是超人,但是現在藝人的競爭真的很激烈。長的好看的人很多,所以藝人都知道實力很重要,實力也是最基本的。而且,當練習生的投入真的很高相當於燒錢,付出相對...