劉兵
(中國電子科技集團第二十八研究所,江蘇 南京210007)
本論文的研究內容是設計并實現一個基于Linux 平臺B/S架構的多功能信息檢索代理系統,該系統能夠實現本地文件檢索和詞語的在線搜索,使用戶有更好的用戶體驗。更好地利用Linux 系統,提高工作效率和學習效率。
近年來,Linux 操作系統的普及,Linux 發行了各種版本,包括Red Hat Linux、Ubuntu Linux、SuSE Linux 及Gentoo Linux等,國內的中標和麒麟也越來越成熟,越來越多的用戶選擇Linux 系統。但目前各Linux 版本下沒有一個易于使用的像Windows 系統下的本地快速搜索工具。因此,開發一個輕量級本地文件搜索工具是非常必要的。
任何操作系統都由數千個文件組成,Linux 系統下的公共文件、字符設備、目錄、塊設備、套接字等都被視為文件。通常在Linux 系統下確定問題存放位置的方法有三種:Linux 系統桌面版本的文件管理器、locate 命令和find 命令。
文件管理器是Linux 系統提供用戶界面管理文件的工具,常見的Linux 文件管理器有鸚鵡螺、海豚、尼莫和牡丹等。這些管理器都提供了文件管理、文檔查看及網絡瀏覽的功能。對普通用戶而言文件管理器是最方便的文件搜索工具。但是,Linux系統的文件管理器在搜索文件時是對整個磁盤文件進行掃描,搜索文件的時間會很長,嚴重影響用戶的體驗和工作效率。
Linux 系統下通常用find 命令在指定的目錄下查找文件。find 命令根據文件屬性包括文件名、正則表達式、文件權限、文件大小等多種查詢方式進行搜索。由于find 命令會在當前目錄下查找所有的子目錄和文件,所以如果系統中文件和目錄比較復雜時通過find 命令查找文件的效率會很低,通常要花十幾分鐘才能搜索完整個目錄樹。
Linux 系統下通過定位命令可以快速的搜索到系統的指定文件,它的效率比find 命令要快很多。Locate 命令預先構建一個包括系統所有文件名和路徑的索引數據庫,然后當搜索文件時只需要在這個索引數據庫中進行查詢匹配文件信息就可以了。構建索引數據庫需要遍歷整個Linux 系統的根目錄,這個過程比較耗費資源,而且locate 命令不是實時查找,查找的結果不是百分百準確。
通過對上述三種方法的分析,都不能滿足用戶快速實時準確進行文件檢索和詞語的在線搜索,所以設計和開發一個本地文件快速搜索工具來滿足工程中的用戶需求當務之急。
快速搜索工具軟件設計結構主要包括業務邏輯、后臺數據處理、用戶界面三個部分,該軟件采用簡化的模型- 視圖- 控制器(MVC)模式。MVC 模式可以把數據庫和業務邏輯以及用戶界面的開發分開,當軟件需求、算法改進或用戶界面改變時,軟件易于維護和升級。
業務邏輯模型(LogicModule.py)用于處理搜索工具軟件的數據邏輯。它包含了創建文件索引數據庫、索引數據庫庫的查詢、數據庫記錄更新以及全局變量等。主要功能如表1 所示。這些函數實現指定目錄中的文件索引創建、索引數據庫創建、實時文件索引更新和索引數據的查詢等。

表1 業務邏輯模型中的主要功能
后臺數據管理使用SQLite 數據庫。SQLite 是一款輕型的關系型數據庫,其特點是體積小、性能高、可移植性。同時它可以在Windows、Unix、Linux 等主流操作系統的軟件平臺中運行。它可以與許多編程語言(C、Java、PHP、Python 等)以及ODBC 接口相結合。
Python 作為一種跨平臺的、結合了編譯性、解釋性、互動性和面向對象的腳本語言,Python 開發人員可以選擇GUI 開發框架,包括wxpython、pyqt5、gtk 和tkinter。
由于工程中各應用軟件都是基于QT 進行開發的,所以該軟件選擇pyqt5 作為用戶界面的開發框架。
3.1.1 數據的實時更新
Inotify 是一個Linux 內核特性,它提供了監視文件系統事件的機制,及時向應用程序發出相關的事件警告,比如文件刪除、文件添加,文件讀寫和卸載操作等,還可以跟蹤活動的源頭和目標等細節。
3.1.2 實時監控和更新文件索引
Inotifywait 用于收集有關文件訪問信息。該命令可以監視任何指定的文件或目錄,并且可以遞歸地監視該目錄下的整個目錄樹。
在應用程序使用inotifywait 命令獲取監視目錄更改事件之后,應用程序將保存更改的信息并更新數據庫中的信息。主要腳本如下:

為了從字典中快速找到對應的單詞,系統使用一種特定的方法來查找單詞排序。
這個詞建立了一個等級索引。在搜索時使用二進制搜索算法,首先在第一級索引中查找,查找在單詞所在的頁面之后,仍然使用二進制搜索算法在頁面中找到它。二進制搜索要求:a.必須采用順序存儲結構;b.必須按關鍵字大小順序排列。
優缺點:半重搜索方法的優點是比較次數少,搜索速度快,平均性能好;缺點是待檢查的表是排序表,插入和刪除困難。因此,二元搜索方法適用于不頻繁變化查找頻繁排序的列表。
算法思想:首先,將記錄在表的中間位置的關鍵字與搜索關鍵字進行比較。如果兩者相等,則搜索成功;否則,如果中間位置,則使用中間位置記錄將表劃分為兩個子表。如果位置記錄的關鍵字大于搜索關鍵字,則進一步搜索前一個子表,否則在進一步搜索之后。比較后一個子列表的中間記錄關鍵字和要搜索的關鍵字,重復上述步驟,直到找到為止。下面提供了算法的偽代碼:


二進制搜索算法充分利用待檢數組的有序特性,采用分治策略。即使在最壞的情況下,算法的搜索時間復雜度也是O(log n)。
該軟件設計主要用于某工程的文件檢索和定位,該工程中需要在硬盤上保存大量的系統實時數據,該數據包括原始數據、運算結果、報表評估等各種結果數據,數據量大,存儲的結構比較復雜,而且用戶需要根據知道的條件快速定位到文件,獲取到文件的詳細信息。
系統實際的運行環境:
操作系統是Enterprise Red Hat 7; 開發工具是PyDev 插件和Eclipse;硬件CPU 為inter i7、內存ddr3 256GB、和1TB 硬盤。
軟件運行效果如圖1 所示。

圖1 本地搜索運行截圖
該軟件能滿足用戶在系統軟件中快速定位文件的需求,而且在工程中得到了驗證,得到了用戶的肯定。
和Linux 系統自帶的文件管理器、locate 命令和find 命令相比,該工具體積小,運行速度快,搜索文件快,同時還支持模糊查詢,通過工具查詢到結果后雙擊搜索到的文件即可打開所需文件并實現文件索引的實時更新。后續軟件設計將引入多線程技術,優化文件索引的算法,縮短索引的建立時間,同時完善索引接口來實現智能化搜索,提高用戶在工程中的使用滿意度。