楊凱飛 ,李文波 ,柯 川
1(中國科學院 軟件研究所 基礎軟件國家工程研究中心,北京 100190)2(中國科學院大學,北京 100049)
面向桌面環(huán)境的索引實時更新方法①
楊凱飛1,2,李文波1,柯 川1,2
1(中國科學院 軟件研究所 基礎軟件國家工程研究中心,北京 100190)2(中國科學院大學,北京 100049)
在桌面計算環(huán)境中,文件和目錄頻繁發(fā)生新建、刪除、修改、重命名、移動、復制等變化,這對桌面索引更新的實時性和性能提出更高要求,而傳統(tǒng)的桌面索引更新方法完全或部分依賴周期性全盤掃描,往往需要大規(guī)模索引重建,導致索引生成延遲大、系統(tǒng)資源占用高.針對這些弊端,本文提出了一種基于文件系統(tǒng)事件監(jiān)聽的桌面索引實時更新方法,并實現(xiàn)了相應的桌面索引實時更新系統(tǒng).實驗表明:本文提出的索引更新方法延遲低、系統(tǒng)資源占用低.
桌面搜索; 文件系統(tǒng)監(jiān)控; 索引更新; 文本抽取; inotify
隨著用戶所掌握的數(shù)據(jù)量迅速增加和PC存儲容量的大幅增長,PC中存儲的文檔、圖片、視頻等越來越多,這些數(shù)據(jù)量大且存儲無序、不規(guī)則,管理、查找較為困難.從如此大規(guī)模的文檔集中尋找所需耗時費力,桌面搜索引擎的重要性逐漸凸顯.桌面搜索引擎用于索引和檢索PC中的文檔信息,Google、Yahoo、Microsoft、百度等先后推出桌面搜索引擎.
類似于網(wǎng)絡搜索引擎,桌面搜索引擎多采用先為桌面文檔建立索引再提供查詢的方式.這極大地提升了查詢速度,但也帶來了桌面索引更新的問題,桌面索引需及時更新,才能保證其與文檔內(nèi)容一致.因為桌面文檔頻繁發(fā)生新增、刪除、修改、重命名、移動、復制等變化,桌面索引更新的實時性和性能要求更為嚴苛.
桌面索引更新的基本方式有兩種:1)周期性掃描所有文件和目錄并檢測其變化,為發(fā)生變化的文件或目錄更新索引.該方法需周期性遍歷所有文件和目錄,不僅性能差,而且延遲時間長,無法保證索引更新的實時性; 2)基于操作系統(tǒng)或第三方的文件系統(tǒng)事件監(jiān)聽方法,實時監(jiān)聽文件系統(tǒng)事件并更新索引.這種方法實時性好、效率高.現(xiàn)有桌面索引更新系統(tǒng)多采用方式1)或以其為主[1],往往需要周期性重建索引,導致索引更新延遲大、系統(tǒng)資源占用高.方式2)雖然高效、實時,但Linux內(nèi)核文件系統(tǒng)變化通知機制存在無法監(jiān)聽子目錄、冗余信息未過濾等典型缺點,依靠其實現(xiàn)的現(xiàn)有監(jiān)聽方法存在監(jiān)控效率低、穩(wěn)定性差、維護復雜等缺點.這也是方式2)未被桌面索引更新系統(tǒng)單獨和廣泛采用的重要原因.
針對桌面環(huán)境的特性和現(xiàn)有桌面索引更新方法的弊端,本文提出了一種基于文件系統(tǒng)事件監(jiān)聽的桌面索引實時更新方法,無需周期性掃描全盤即可保證索引內(nèi)容與桌面文檔完全一致.本方法能夠?qū)崿F(xiàn)對文件系統(tǒng)事件的實時監(jiān)聽以及快速更新索引內(nèi)容.我們研究了現(xiàn)有Linux文件系統(tǒng)事件監(jiān)聽方法,在此基礎上,提出了一種Linux文件系統(tǒng)事件實時監(jiān)聽方法并實現(xiàn),克服了現(xiàn)有方法的典型缺點.最后,在Linux操作系統(tǒng)上實現(xiàn)了桌面索引實時更新系統(tǒng),采用了多種性能優(yōu)化策略提升其索引速度.實驗表明:本文提出的桌面索引實時更新方法延遲時間短、系統(tǒng)資源占用低.
桌面搜索引擎采用預先為桌面文檔建立索引的方式來提升用戶檢索信息的速度,但由于桌面文檔頻繁發(fā)生變化,桌面索引需要頻繁并且實時更新.桌面索引實時更新的核心是及時獲取到文件的變化,現(xiàn)有桌面索引更新方法完全或部分依賴周期性全盤掃描的方法獲取發(fā)生變化的文件和目錄,這種方法延遲大、效率低.采用實時監(jiān)聽文件系統(tǒng)事件的方式可以大幅提升索引更新的實時性和效率,所以本文首先研究了現(xiàn)有Linux文件系統(tǒng)事件監(jiān)聽方法.
除了需要實時監(jiān)聽文件系統(tǒng)事件,桌面文檔頻繁變化還帶來了桌面索引更新策略如何選擇的問題,尤其是目錄發(fā)生變化時如何更高效地更新桌面索引的內(nèi)容.桌面索引中一般會存儲文檔的絕對路徑等元數(shù)據(jù)信息,目錄的變化會導致其所包含的所有文件均需要更新,表1列舉了目錄發(fā)生不同類型的變化時對桌面索引的影響.在不同的變化類型下,選擇不同的更新策略會對系統(tǒng)性能產(chǎn)生較大影響.例如,若目錄發(fā)生重命名事件,一種策略是先從索引中刪除該目錄下所有文件的索引信息,再從新目錄中抽取所有文件信息并為其重建索引.第二種策略是在倒排索引中定位所有需要更改的信息,修改部分元數(shù)據(jù)信息即可.若目錄中包含大量文件,則第二種策略在性能上明顯占優(yōu).相應的,目錄刪除、移動、復制等變化同樣需要采取優(yōu)化的索引更新策略.
表1 目錄的變化對桌面索引的影響
Linux內(nèi)核先后引入了dnotify、inotify、fanotify三種文件系統(tǒng)變化通知機制.dnotify從Linux 2.4.0內(nèi)核開始引入,是三者中最早引入的,但是存在很多缺陷.inotify從 Linux 2.6.13內(nèi)核開始引入,完全替代了dnotify,也是三者中目前使用最廣泛的[2-5].fanotify從Linux 2.6.36內(nèi)核開始引入,與inotify相比各有所長.
dnotify可以監(jiān)控文件系統(tǒng)中目錄的變化事件,目錄中某個文件發(fā)生訪問、新建、刪除、更改、屬性修改等變化時均會發(fā)出通知.但是dnotify只能監(jiān)控某個目錄中發(fā)生的變化,而無法及時獲取發(fā)生變化的具體文件,需要進一步獲取信息,而且它需要對每一個被監(jiān)控目錄打開一個文件描述符,若文件所在磁盤需要卸載,會受到影響.此外,它返回的事件信息較少.
inotify監(jiān)控粒度更細,可獲取發(fā)生變化的文件信息,而且監(jiān)控的事件類型很多,涵蓋文件新建、刪除、移動等多種類型事件.但是,inotify 的一個監(jiān)視 (watch)只能監(jiān)控一個目錄,無法遞歸監(jiān)控其子目錄,而且單個用戶可創(chuàng)建的inotify實例數(shù)目和每個inotify實例可關(guān)聯(lián)的監(jiān)視數(shù)目均有限制,兩者的默認值分別為128和8192.在Linux環(huán)境下,可分別通過修改配置文件“/proc/sys/fs/inotify/max_user_instances”和“/proc/sys/fs/inotify/max_user_watches”修改兩者的默認值[6,7].
fanotify既可以通知文件系統(tǒng)變化,也可以攔截文件系統(tǒng)變化,應用程序使用fanotify的訪問控制(Access Decision)功能可以決定是否允許其它應用程序?qū)ξ募牟僮鱗8].fanotify提供三種文件系統(tǒng)變化監(jiān)控模式:全文件系統(tǒng)監(jiān)控(Global)、單個掛載點監(jiān)控(per-mount)、單個對象監(jiān)控 (Directed).fanotify 不僅可以監(jiān)控其它程序?qū)ξ臋n和目錄的操作,還能決定是否允許其操作.表2比較了三種機制監(jiān)聽文件系統(tǒng)事件的特性.
在桌面搜索場景中,Linux內(nèi)核文件系統(tǒng)變化通知機制有兩點主要不足:
1)單個監(jiān)視(watch)無法監(jiān)聽子目錄內(nèi)部的事件.例如,對inotify而言,單個監(jiān)視只能監(jiān)聽到目錄中文件和直接子目錄的變化,而子目錄內(nèi)事件的監(jiān)聽需由新的監(jiān)視負責.fanotify有三種模式,雖然其 Global模式和Per-mount模式可以分別實現(xiàn)對全盤和某個掛載點的全部文件系統(tǒng)事件的監(jiān)聽,但其依然無法實現(xiàn)在監(jiān)控某一目錄對象時監(jiān)聽包括其子目錄在內(nèi)的所有文件系統(tǒng)事件,而且fanotify監(jiān)聽的事件類型過少,根本無法滿足桌面索引實時更新系統(tǒng)的需求.
2)存在冗余信息.例如,為保證事件無遺漏,inotify未過濾臨時文件的變化信息,這為桌面索引更新帶來不便.
通過封裝Linux內(nèi)核提供的文件系統(tǒng)變化通知機制,第三方的文件系統(tǒng)事件監(jiān)聽庫函數(shù)也可為應用程序提供對文件系統(tǒng)事件的實時監(jiān)聽.下面對兩個提供Java API的監(jiān)聽庫進行重點研究.
1)JNotify 是一套 Java API,可以為 Java 應用程序提供監(jiān)聽文件系統(tǒng)事件的功能,這些事件包括文件和目錄新建、刪除、修改和重命名等.在Linux操作系統(tǒng)環(huán)境下,JNotify 實際上是 Linux Inotify API的簡單封裝.Inotify的單個監(jiān)視不支持遞歸監(jiān)控子目錄,JNotify通過為監(jiān)控目錄下的每個子目錄遞歸創(chuàng)建一個監(jiān)視實現(xiàn)了這個功能,但這一過程的時間消耗也隨著子目錄層數(shù)的增加而呈現(xiàn)指數(shù)增長,同時也帶來了系統(tǒng)資源需求的增加[9,10];
2)JDK 自 1.7 版本開始,提供了 WatchService API供應用程序監(jiān)聽文件系統(tǒng)事件,可監(jiān)聽事件包括文件和目錄新建、刪除和修改事件.
Linux內(nèi)核文件系統(tǒng)變化通知機制中,dnotify由于存在諸多不足,fanotify由于支持的事件類型太少,均無法滿足需要.所以,現(xiàn)有Linux文件系統(tǒng)事件監(jiān)聽方法一般基于inotify實現(xiàn).
在桌面環(huán)境中,文件和目錄頻繁發(fā)生變化,桌面索引的實時更新對文件系統(tǒng)事件的監(jiān)聽過程提出了實時、高效、無遺漏的要求.由于inotify的單個監(jiān)視無法監(jiān)聽子目錄內(nèi)部的事件,所以若要監(jiān)聽某一目錄范圍內(nèi)所有支持的文件系統(tǒng)事件,需為其所有子目錄添加監(jiān)視.這意味著桌面索引更新系統(tǒng)若要無遺漏的監(jiān)控文件系統(tǒng)事件,需要為所有子目錄添加監(jiān)視.因為真正發(fā)生變化的子目錄數(shù)目相對較少,所以這種方式必然會添加大量無效的監(jiān)視.例如,Linux中/home目錄的子目錄個數(shù)可能達到上萬個,這意味著若要監(jiān)聽/home目錄范圍所有文件系統(tǒng)事件,添加的無效監(jiān)視可能達到數(shù)千甚至上萬個.而且,若監(jiān)視超過默認值,需要修改系統(tǒng)配置文件,這也帶來不必要的麻煩.JNotify采用的就是這種方式,這種方式導致監(jiān)視的數(shù)目會隨子目錄層數(shù)的增長呈指數(shù)增長.監(jiān)視數(shù)目的增長會帶來兩方面問題:1)大量的監(jiān)視會導致初始化耗時增加、監(jiān)控效率下降; 2)每個監(jiān)視與子目錄相關(guān)聯(lián),子目錄更改后需要增刪監(jiān)視,而大量監(jiān)視的維護與頻繁增刪操作過程復雜.
此外,現(xiàn)有Linux文件系統(tǒng)事件監(jiān)聽方法的事件通知中存在很多冗余信息,這會導致桌面索引更新系統(tǒng)進行無效的更新操作或?qū)е滤饕率?例如,當用戶打開一個文檔進行修改時,編輯器一般會新建一個臨時文件,而這個臨時文件的內(nèi)容是不應該被索引的,索引它會導致桌面索引中存在無效內(nèi)容.
綜上,現(xiàn)有Linux文件系統(tǒng)事件監(jiān)聽方法無法滿足桌面索引實時更新的性能和功能需要,所以本文提出了一個Linux文件系統(tǒng)事件實時監(jiān)聽方法,克服了現(xiàn)有方法的典型缺點.
文件系統(tǒng)事件監(jiān)聽方法是索引實時更新的核心,針對現(xiàn)有Linux文件系統(tǒng)事件監(jiān)聽方法的缺點,基于Linux內(nèi)核文件系統(tǒng)變化通知機制,提出一種Linux文件系統(tǒng)事件實時監(jiān)聽方法并實現(xiàn).
現(xiàn)有Linux文件系統(tǒng)事件監(jiān)聽方法為所有子目錄添加監(jiān)視,需要維護的監(jiān)視數(shù)目隨子目錄層數(shù)的增加而成指數(shù)增長,大量的監(jiān)視提升了初始化耗時、維護成本等.相比而言,Linux文件系統(tǒng)事件實時監(jiān)聽方法對用戶操作子目錄行為進行監(jiān)控,只為可能發(fā)生文件變化的子目錄添加監(jiān)視.既能夠無遺漏地監(jiān)聽指定目錄范圍中所有支持的文件系統(tǒng)事件,也大大減少了對無關(guān)子目錄的監(jiān)控,只需維護極少數(shù)目的監(jiān)視.另外,根據(jù)異常文件名稱、文件是否存在、特殊符號等規(guī)則過濾了冗余信息.
Linux文件系統(tǒng)事件實時監(jiān)聽方法的輸入信息:待監(jiān)控目錄、禁止監(jiān)控的子目錄,輸出信息:發(fā)生變化的文件、變化類型(新增、刪除、修改、重命名).
如圖1,描述了Linux文件系統(tǒng)事件實時監(jiān)聽方法的工作流程,主要包括三步.
圖1 Linux文件系統(tǒng)事件實時監(jiān)聽方法流程圖
步驟1.對待監(jiān)控目錄的子目錄打開和關(guān)閉事件進行監(jiān)聽,基于規(guī)則過濾冗余信息.監(jiān)聽到子目錄打開或關(guān)閉事件后,將打開的子目錄信息添加到監(jiān)控目錄列表中,并從監(jiān)控目錄列表中刪除關(guān)閉了的子目錄信息.同時觸發(fā)監(jiān)控目錄列表變化事件,該事件中包含兩個關(guān)鍵信息:目錄名稱、操作類型(添加或刪除).其中,監(jiān)控列表的長度由系統(tǒng)設定,當達到最大長度時采用LRU算法替換列表中的數(shù)據(jù).
步驟2.監(jiān)聽監(jiān)控目錄列表變化事件.監(jiān)聽到事件后,根據(jù)操作類型和目錄名稱添加或刪除某個子目錄的監(jiān)視.
步驟3.每個監(jiān)視監(jiān)聽目錄中文件或直接子目錄的新建、刪除、修改、重命名四種事件.監(jiān)聽到事件后,首先根據(jù)文件名稱是否合法、隱藏屬性、文件是否存在等規(guī)則過濾臨時文件、緩存文件等引發(fā)的事件通知,并通知外部應用.
基于Linux文件系統(tǒng)事件實時監(jiān)聽方法設計并實現(xiàn)了相應系統(tǒng).系統(tǒng)包括三個模塊:用戶目錄操作行為監(jiān)控、監(jiān)控目錄存儲和文件系統(tǒng)事件監(jiān)聽,如圖2所示.
圖2 實時監(jiān)聽系統(tǒng)架構(gòu)圖
用戶目錄操作行為監(jiān)控模塊負責監(jiān)聽待監(jiān)控目錄中所有子目錄打開和關(guān)閉事件,并依據(jù)設置的禁止監(jiān)控子目錄過濾事件.該模塊基于fanotify實現(xiàn).
監(jiān)控目錄存儲模塊負責維護監(jiān)控目錄列表,它根據(jù)用戶目錄操作行為監(jiān)控模塊監(jiān)聽到的子目錄打開和關(guān)閉事件增加或刪除監(jiān)控目錄列表中的數(shù)據(jù)并發(fā)送事件通知給文件系統(tǒng)事件監(jiān)聽模塊.該模塊基于Java LinkedHashMap實現(xiàn).
文件系統(tǒng)事件監(jiān)聽模塊負責根據(jù)監(jiān)聽到的監(jiān)控目錄列表變化事件添加或刪除子目錄的監(jiān)視,每個監(jiān)視負責監(jiān)聽目錄中文件和直接子目錄新增、刪除、修改、重命名事件.當事件發(fā)生時,文件系統(tǒng)事件監(jiān)聽模塊通知使用該機制的外部應用.該模塊基于對inotify的Java封裝API實現(xiàn).
桌面索引更新過程可以細分為三個步驟:1)及時獲取發(fā)生變化的文件或目錄; 2)基于文件系統(tǒng)事件類型采取合適的策略更新索引; 3)快速獲取發(fā)生變化的文件或目錄的信息.本文提出一種基于文件系統(tǒng)事件監(jiān)控的桌面索引實時更新方法,針對以上三個步驟分別給出了方案:1)基于Linux文件系統(tǒng)事件實時監(jiān)聽方法及時獲取文件和目錄的變化; 2)根據(jù)發(fā)生變化的是文件或目錄以及變化類型選擇優(yōu)化的索引更新策略,避免目錄發(fā)生變化時大規(guī)模更新甚至重建索引; 3)在索引更新系統(tǒng)的實現(xiàn)中,提出并采用了多種性能優(yōu)化策略來提高文件信息提取速度.
方案1)的具體實現(xiàn)已在上一節(jié)詳述,方案3)中具體的優(yōu)化策略將在下一節(jié)詳述,下面重點敘述方案2).
在基于周期性遍歷的索引更新方法中,無法監(jiān)聽文件系統(tǒng)事件,所以也就無法根據(jù)文件系統(tǒng)事件類型優(yōu)化索引更新策略.在基于文件系統(tǒng)事件監(jiān)聽的桌面索引更新方法中,當監(jiān)聽到文件系統(tǒng)事件時,根據(jù)發(fā)生事件的主體是文件或目錄以及事件類型選擇合適的索引更新策略.在Lucene等開源搜索引擎的倒排索引結(jié)構(gòu)中,數(shù)據(jù)存儲在邏輯上有Document、Field等概念,分別可以類比為關(guān)系數(shù)據(jù)庫中的一行記錄和列.在本方法中,一個文件的信息在桌面索引中對應一個Document,每個 Document都有一個唯一 ID,我們將其設置為文件的絕對路徑,具體的索引更新策略如表3所示.
表3 針對不同事件主體和類型的索引更新策略
圖3為基于文件系統(tǒng)監(jiān)控的桌面索引實時更新方法執(zhí)行流程,包括如下步驟:
步驟1.讀取配置文件并判斷其是否合法.
步驟2.獲取用戶配置的可索引目錄,監(jiān)聽該目錄范圍所有文件系統(tǒng)事件.若目錄新增事件發(fā)生,跳轉(zhuǎn)到步驟3.若文件新增、修改或重命名事件發(fā)生,跳轉(zhuǎn)到步驟4.若文件刪除事件發(fā)生,則跳轉(zhuǎn)到步驟7.若目錄刪除、修改或重命名事件發(fā)生,跳轉(zhuǎn)到步驟8.
步驟3.掃描所有文件,獲取格式符合要求的所有文檔.
步驟4.抽取文件的內(nèi)容,同時獲取文件的元數(shù)據(jù):文件名、文件格式、絕對路徑.其中,若文件格式不屬于用戶規(guī)定的可抽取格式,則將其文件內(nèi)容字段置為空.
步驟5.對步驟4獲得的文件內(nèi)容和元數(shù)據(jù)進行分詞,擴充部分字段.
步驟6.以文件絕對路徑作為ID,在索引中添加文檔,結(jié)束.
步驟 7.獲取文件絕對路徑,匹配索引中的 ID,刪除相應文檔,結(jié)束.
步驟 8.若為目錄刪除事件,獲取目錄絕對路徑,以前綴匹配方式獲取索引中所有相關(guān)文檔并批量刪除.若為目錄修改或重命名事件,獲取目錄絕對路徑,以前綴匹配方式獲取索引中所有相關(guān)文檔更新其ID和絕對路徑字段,結(jié)束.
圖3 桌面索引實時更新方法流程圖
基于本文提出的桌面索引實時更新方法,設計和實現(xiàn)了桌面索引實時更新系統(tǒng).
如圖4所示,本系統(tǒng)由日志記錄、配置管理、事件感知、文本抽取、文本分析、索引更新六個模塊組成.其中,所有模塊均調(diào)用日志記錄模塊,在圖4 中省略日志記錄模塊.
圖4 桌面索引實時更新系統(tǒng)框架圖
日志記錄模塊負責記錄系統(tǒng)索引文檔的過程信息及可能出現(xiàn)的錯誤,便于系統(tǒng)異常時查錯; 配置管理模塊負責管理用戶配置信息; 事件感知模塊負責監(jiān)聽可索引目錄中文件系統(tǒng)事件; 文本抽取模塊負責抽取文件內(nèi)容和元數(shù)據(jù); 文本分析模塊負責為文件內(nèi)容和元數(shù)據(jù)做分詞等后續(xù)處理; 索引更新模塊負責更新倒排索引.
本系統(tǒng)使用C、Java開發(fā),在Linux操作系統(tǒng)實現(xiàn).
日志記錄模塊記錄如下信息:被索引文件元數(shù)據(jù)信息、索引過程信息、系統(tǒng)異常信息.根據(jù)日志信息的級別將其輸出至日志文件或運行窗口.該模塊基于Apache log4j庫實現(xiàn).
配置管理模塊將所有配置信息以鍵值對形式存儲在程序根目錄的“config.properties”文件中,用戶可修改該文件以靈活定制索引選項.配置管理模塊在系統(tǒng)啟動時首先判斷配置文件是否存在并檢測配置信息是否合理,然后獲取配置信息并提供給其他模塊.用戶可配置的選項包括:可索引目錄、禁止索引目錄、可索引文件格式、可抽取文件格式.
事件感知模塊基于對用戶操作目錄行為的監(jiān)控,只為可能發(fā)生文件變化的子目錄添加監(jiān)視,每個監(jiān)視負責監(jiān)聽單個目錄中文件和直接子目錄的新增、刪除、修改、重命名事件,但不包括其子目錄中的文件系統(tǒng)事件.該模塊基于Linux文件系統(tǒng)事件實時監(jiān)聽方法實現(xiàn).
文本抽取模塊抽取了Word、Pdf、Txt、PPT、JPG等常見格式文件的內(nèi)容和元數(shù)據(jù),抽取的信息包括:文件名稱、絕對路徑、文件格式、文件內(nèi)容.該模塊基于 Apache Tika[11]實現(xiàn),Tika 在搜索引擎、文本分析、文本翻譯等場景中應用廣泛[12-14].
文本分析模塊基于IkAnalyzer[15]分詞工具實現(xiàn),對抽取模塊得到的部分字段進行分詞,同時擴充部分字段.
索引更新模塊基于 Apache Lucene[16]實現(xiàn),負責基于桌面文檔的變化更新倒排索引.Lucene將復雜的索引和檢索過程以簡單的接口呈現(xiàn)給應用[17],在桌面搜索場景有廣泛應用[18].
桌面索引實時更新既需要及時獲取文件系統(tǒng)變化,也需要快速完成文檔索引.分析和測試了索引過程各個階段的耗時,提出并應用了多種優(yōu)化策略以加快索引速度.
混合抽取策略.Tika作為抽取框架,為不同格式文件提供了統(tǒng)一的抽取接口.Tika抽取文件內(nèi)容包括三步:文件類型檢測、文件解析器選擇、內(nèi)容抽取.若跳過前兩步,直接抽取文檔將提升文本抽取速度.因為PDF文件抽取相對較慢,基于加快抽取速度和保證不同文件格式抽取接口統(tǒng)一性的考慮,決定對PDF文件的抽取速度進行重點優(yōu)化.首先,通過實驗比較了不同數(shù)據(jù)集下Tika和Pdfbox抽取PDF的速度.
表4 抽取測試數(shù)據(jù)集
表5 pdf抽取測試結(jié)果
通過以上實驗發(fā)現(xiàn),對小文件的抽取,Pdfbox快于 Tika.而對于大文件,Pdfbox 慢于 Tika.基于以上結(jié)果,系統(tǒng)采取如下混合抽取策略:
1)若文件格式為 PDF,且大小小于 1 MB,直接調(diào)用Pdfbox抽取.
2)其余文件調(diào)用org.apache.tika.parser.Parser類抽取.
多線程處理.文本抽取和分詞耗時較長,所以采用多線程方式處理.為兼顧速度與系統(tǒng)資源占用,多線程基于以下原則:1)單個線程處理的文件數(shù)目固定; 2)線程數(shù)目由文件總數(shù)決定,但不超過最大值.
在系統(tǒng)實現(xiàn)中,使用StringBuffer代替String進行字符串拼接等操作.
綜合使用以上優(yōu)化方法,索引速度得到了極大提升,其中,混合抽取策略的提速效果最為突出.
實驗測試包括四項:測試Linux文件系統(tǒng)事件實時監(jiān)聽方法的延遲; 測試桌面索引實時更新方法的延遲;測試桌面索引實時更新系統(tǒng)的索引速度并與DocFetcher、Recoll的索引系統(tǒng)進行比較; 測試并比較桌面索引實時更新方法與基于周期性全盤掃描的索引更新方法的內(nèi)存占用.
四項實驗測試均基于Eclipse開發(fā)環(huán)境,Ubuntu 64 位操作系統(tǒng),采用 Intel(R)Core(TM)i7-2600 CPU、14 GB內(nèi)存和1 TB硬盤的硬件平臺.
第一項和第二項實驗均通過連續(xù)復制單個文件到指定目錄觸發(fā)文件新建事件以及桌面索引更新,模擬發(fā)生文件系統(tǒng)事件時的事件通知和索引更新過程.
第三項實驗,即索引速度對比實驗選取的對比系統(tǒng)為 DocFetcher 1.17 和 Recoll 1.21.5,均為這兩款桌面搜索引擎的最新版本.Linux平臺上優(yōu)秀的桌面搜索引擎有 Google Desktop Search、Beagle、DocFetcher、Recoll等,但前兩者均已停止更新較長時間.DocFetcher是一款開源、跨平臺的桌面全文搜索軟件,支持多種格式文檔的快速索引和檢索[19].Recoll是一款基于Xapian開源搜索引擎的桌面全文桌面搜索工具,它提供了強大的文本抽取層和完整、易用的基于Qt的界面[20].第三項實驗中使用的數(shù)據(jù)集信息如表6所示.
表6 實驗數(shù)據(jù)集信息
第一項實驗測試了在發(fā)生不同數(shù)目的文件系統(tǒng)事件時,本文提出的Linux文件系統(tǒng)事件實時監(jiān)聽方法的平均延遲時間.如圖5,隨著文件系統(tǒng)事件的增多,本方法監(jiān)聽到單個事件的平均延遲時間穩(wěn)定在1 ms左右,沒有出現(xiàn)大幅增加或減少.相比現(xiàn)有方法,本方法僅需維護數(shù)目極少的監(jiān)視即可實現(xiàn)對指定目錄范圍發(fā)生的文件系統(tǒng)事件的無遺漏監(jiān)聽,降低了監(jiān)視維護的復雜性及耗時,能夠穩(wěn)定、實時地持續(xù)監(jiān)聽文件系統(tǒng)事件.
圖5 文件系統(tǒng)事件實時監(jiān)聽方法平均延遲時間
第二項實驗測試了在發(fā)生不同數(shù)目的文件系統(tǒng)事件時,本文提出的桌面索引實時更新方法平均延遲時間.圖6 顯示,隨著文件系統(tǒng)事件的增多,桌面索引更新的平均延遲時間穩(wěn)定在90 ms內(nèi),延遲低.
圖6 桌面索引實時更新方法平均延遲時間
第三項實驗測試了本文實現(xiàn)的桌面索引實時更新系統(tǒng)的索引速度并與其它系統(tǒng)對比.如圖7,隨著文件數(shù)目的增加,三個系統(tǒng)耗時均不斷增加,其中Recoll隨著文件數(shù)目的增加性能下降最為嚴重,本系統(tǒng)的耗時遠低于DocFetcher和Recoll.需要說明的是,具體的測試數(shù)據(jù)與使用的數(shù)據(jù)集和硬件性能相關(guān).
第四項實驗對比本文提出的桌面索引實時更新方法與周期性索引更新方法的內(nèi)存占用,如圖8所示.可以發(fā)現(xiàn),本方法內(nèi)存占用少,而且較為穩(wěn)定.需要說明的是,內(nèi)存占用的具體數(shù)值與實驗的條件有關(guān).本實驗通過每五秒鐘新建一個文件來模擬文檔集的變化,周期性掃描的時間間隔為20秒,每隔一秒采集一次內(nèi)存信息,持續(xù)采集150秒.
圖7 索引速度比較圖
圖8 內(nèi)存占用對比圖
現(xiàn)有桌面索引更新方法采用的周期性索引更新策略存在延遲大、系統(tǒng)資源占用高等缺點.針對這些弊端,本文提出并實現(xiàn)了一種基于文件系統(tǒng)事件監(jiān)聽的桌面索引實時更新方法,無需定時掃描全盤即可保證桌面文檔與索引內(nèi)容完全一致.為了實現(xiàn)高效、低延遲地監(jiān)控文件系統(tǒng)事件,研究了現(xiàn)有Linux文件系統(tǒng)事件監(jiān)聽方法,針對其不足,提出并實現(xiàn)了一種Linux文件系統(tǒng)事件實時監(jiān)聽方法,僅需維護極少數(shù)目的監(jiān)視即可實現(xiàn)對文件系統(tǒng)事件的無遺漏監(jiān)聽,而且也對冗余的事件通知信息進行了有效過濾.
在處理目錄刪除、重命名事件時,采取了批量更新倒排索引的策略,避免了大規(guī)模索引更新或重建.在系統(tǒng)的實現(xiàn)中,綜合應用了多種優(yōu)化策略提升索引速度.實驗結(jié)果表明,本文提出的方法在索引更新的延遲時間、系統(tǒng)資源占用方面均有較大提升.本文實現(xiàn)的系統(tǒng)能夠監(jiān)聽和高效處理文件和目錄的新建、刪除、修改、重命名事件,目錄移動和復制等事件均轉(zhuǎn)化為新建、刪除、修改事件處理.如何從高層語義上監(jiān)聽到移動和復制等事件并針對其優(yōu)化索引更新策略需要進一步研究.
1Cen ZW,Xu JG,Sun J.SoDesktop:A desktop search engine.Proc.of the 2012 International Conference on Communication Systems and Network Technologies (CSNT).Rajkot,India.2012.463–467.
2Morgan S,Mortazavi M,Palani G,et al.Metadata index search in a file system:U.S.Patent 20160063021.2016-03-03.
3Xu L,Jiang H,Tian L,et al.Propeller:A scalable real-time file-search service in distributed systems.Proc.of the 34th International Conference on Distributed Computing Systems(ICDCS).Madrid,Spain.2014.378–388.
4Takata M,Sutoh A.Event-notification-based inactive file search for large-scale file systems.Proc.of the 2012 Digest APMRC.Singapore.2012.1–7.
5Onyisi P.Event-driven messaging for offline data quality monitoring at ATLAS.Proc.of the 21st International Conference on Computing in High Energy and Nuclear Physics (CHEP2015).Okinawa,Japan.2015.
6Shields I.Monitor Linux file system events with inotify.http://www.ibm.com/developerworks/ linux/library/l-inotify/.[2010-09-10].
7McCutchan J,Love R,Griffis A.Inotify-get your file system supervised.http://inotify.aiken.cz/.
8Paris E.Fanotify:The fscking all notification system.https://lwn.net/Articles/339253/.[2009-06-29].
9J Notify File system events library for Java.http://jnotify.sourceforge.net/linux.html.
10黃江平.基于Lucene的桌面搜索引擎的研究與應用[碩士學位論文].杭州:浙江理工大學,2012.
11ASF.Apache Tika-a content analysis toolkit.http://tika.apache.org/.
12Mattmann CA,Zitting JL.Tika in Action.Shelter Island,NY:Manning Publications Co.,2011:28–75.
13Burgess AB,Mattmann CA.Automatically classifying and interpreting polar datasets with Apache Tika.Proc.of the 15th International Conference on Information Reuse and Integration (IRI).Redwood City,CA,USA.2014.863–867.
14王旭仁,鄭秋輝,何發(fā)鎂,等.基于 Tika 和 Lucene 的桌面搜索引擎研究與實現(xiàn).計算機工程與設計,2014,35(1):310–314.
15IK Analyzer.http://git.oschina.net/wltea/IK-Analyzer-2012FF.
16Lucene.http://lucene.apache.org/.
17McCandless M,Hatcher E,Gospodnetic O.Lucene in Action:Covers Apache Lucene 3.0.2nd ed.Shelter Island,NY:Manning Publications Co.,2010:3–4.
18劉艷,楊奇龍,蔡燕冬.FileFinder:桌面搜索引擎的設計與實現(xiàn).計算機工程與設計,2013,34(7):2627–2631.
19DocFetch.https://sourceforge.net/projects/docfetcher/.
20Recoll.http://www.lesbonscomptes.com/recoll/.
Index Real-Time Updating Method for Desktop Environment
YANG Kai-Fei1,2,LI Wen-Bo1,KE Chuan1,21(National Engineering Research Center of Fundamental Software,Institute of Software,CAS,Beijing 100190,China)2(University of Chinese Academy of Sciences,Beijing 100049,China)
In the desktop computing environment,files and directories are frequently changed,such as being created,deleted,modified,renamed,moved,and copied,which has higher demands on the real-time updating of desktop index and its efficiency.However,the traditional desktop index updating methods are fully or partially dependent on periodically full scan,which inevitably requires a large-scale index reconstruction and leads to long delay of index generation and high usage of system resources.In order to overcome these drawbacks,this paper puts forward a new desktop index real-time updating method based on a new file system events monitoring,and implements corresponding desktop index real-time updating system.Experimental results show that the proposed index updating method provides lower latency and lower usage of system resources.
desktop search; file system monitoring; index update; text extraction; inotify
楊凱飛,李文波,柯川.面向桌面環(huán)境的索引實時更新方法.計算機系統(tǒng)應用,2017,26(10):20–28.http://www.c-s-a.org.cn/1003-3254/5512.html
國家高技術(shù)研究發(fā)展計劃(863計劃)(2013AA01A603)
2016-04-06; 采用時間:2016-04-27