Dot-Net

哪種搜尋技術/方法最快?(在文件搜尋的上下文中)

  • October 16, 2009

我不知道它們在正常的 Windows 搜尋中使用什麼。但是有一種技術可以立即使用文件索引,然後稍後使用索引進行更快的搜尋。(例如 Windows 搜尋 4.0)

還有比這更快的搜尋方法嗎?您能從實施的角度詳細說明嗎?(假設我可能需要實現它)

為了便於理解,讓我這樣表述:

假設我想建構一個搜尋應用程序,它執行類似於我們在 Windows 中使用的搜尋操作。

我的問題是,建構這樣的應用程序有哪些可能的選項/方式/方法?(並且比現有的更快。)

(可以使用二叉搜尋樹這種技術嗎?)

基本上有兩種技術用於對大型語料庫進行全文搜尋:發布列表和後綴數組。

發布列表是 (term, document_id) 對的列表,可以選擇在文件中包含位置。如果您按術語對其進行排序或散列,您將擁有一個可高效搜尋的全文索引。

有多種技術可以使發布列表更小、訪問更快、更新更快、更靈活,其中一些是以準確性為代價的。Lucene 可能是當今最好的基於發布列表的現成文本索引器,並且(與您之前的評論相反)它可以索引 PDF、Microsoft Word 等文件中的文本。Thomas Maierhofer 連結的Lucene.net 項目看起來是一個相當合理的埠,當然您總是會落後於 Java 版本的前沿。

對於比記憶體大得多的語料庫,您幾乎必須將發布列表儲存在磁碟上。這不利於使用簡單的二叉搜尋樹來訪問它:如果您有十萬個文件,每個文件有一萬個單詞,那麼您就有十億個文章,這意味著您的二叉搜尋樹的最小深度為 30。這樣做的問題是從樹根到葉子的路徑上的 30 個節點通常位於磁碟的不同部分——因此磁碟必須搜尋 30 次才能找到一個學期的文章!這大約是 2.5 秒,速度非常慢。

但是,有一個名為“B-tree”的二叉樹資料結構的修改版本可以工作。Lucene 使用了一種簡單的資料結構,它很像 B 樹,但更容易支持大規模更新。我在自己的dumbfts 項目中編寫了一個非常簡單的相同資料結構版本,它在幾頁 Python 中為我的電子郵件實現了一個全文搜尋引擎。我每天都在使用它,它是免費軟體,而且它非常適合我的用途,但它不像 Lucene 那樣完全是一個世界級的搜尋系統。

作為以準確性為代價使發布列表更小的範例,Managing Gigabytes 書(和mg4j 項目)有一個稱為“簽名最小完美雜湊表”的資料結構,它實際上並不儲存被索引的術語 -只是它們的雜湊值。因此,誤報的可能性很小——您必須檢索據稱包含該術語的文件,以確認它們確實包含該術語。

後綴數組是基數樹(又名嘗試)的更緊湊且速度稍慢的版本,由 GLIMPSE 和其他一些程序實現,但這些天它們基本上已經不再使用了。它們具有一些在發布列表資料結構中不存在的靈活性——例如,它們允許正則表達式搜尋和拼寫錯誤搜尋,但它們並沒有那麼快。Burrows-Wheeler Transform 最近有一些工作,它基於後綴數組,提供一種壓縮算法,其中壓縮文件全文索引!記錄最好的版本稱為FM-index,雖然我聽說有舊版本的技術,可能未發表。不過,與上面描述的其他技術不同,我認為當文件是 PDF 文件或類似文件時,這實際上不起作用——你仍然可以使用相同的方法來提取每個頁面的文本版本並對其進行索引,但是你不需要’沒有得到壓縮原始文件的好處。

我的熟人蒂姆早在 2003 年就在搜尋上寫了一個非常好的介紹性系列部落格文章,這些文章仍然非常棒。他們更深入地涵蓋了這些東西(除了最近的發展)。

拉維:這是你正在尋找的資訊嗎?

編輯:感謝您修復我的格式,馬丁!

引用自:https://stackoverflow.com/questions/1415078