《電子技術應用》
您所在的位置:首頁 > 通信與網絡 > 設計應用 > 主題搜索引擎的研究
主題搜索引擎的研究
李瑞芳,楊 娜
摘要: 介紹了將開源的全文檢索工具包Lucene嵌入到自己的搜索引擎中來滿足開發(fā)主題搜索引擎的需求。并基于Lucene中文分詞的不足設計了一個比較完善的中文分詞器,然后將其引入具體應用中,并且與傳統(tǒng)搜索引擎在性能上進行了比較。
關鍵詞: 索引 中文分詞
Abstract:
Key words :
</a>

  摘 要: 介紹了將開源的全文檢索工具包Lucene嵌入到自己的搜索引" title="索引">索引" title="索引">索引擎中來滿足開發(fā)主題搜索引擎的需求。并基于Lucene中文分詞的不足設計了一個比較完善的中文分詞器,然后將其引入具體應用中,并且與傳統(tǒng)搜索引擎在性能上進行了比較。
  關鍵詞: Lucene;全文檢索技術;主題搜索引擎;索引;中文分詞

   國際互聯(lián)網的迅速發(fā)展使得以Internet為載體的中文電子信息愈來愈多,傳統(tǒng)搜索引擎采集索引查詢內容不斷擴大,這不但使搜索引擎面臨巨大的困難,而且越來越不能滿足主題用戶的需求。例如,為了獲取數(shù)條相關信息,用戶不得不在大量的失效信息、甚至垃圾信息中費力尋找。目前人們對搜索引擎的首要關注點已經從如何找到更多的信息轉向如何快速找到準確、有用的信息。因此,人們希望在企業(yè)應用中或者個人產品中加入自己的搜索功能。這樣不僅可以對企業(yè)發(fā)布的信息建立索引,也可以對企業(yè)計算機內長期積累的電子文檔資料建立索引,實現(xiàn)方便快速查找。
  在Lucene API的基礎上開發(fā)面向主題的搜索引擎[1]是一種有效、低成本的選擇,因為Lucene全文數(shù)據庫采用倒排文件索引技術[2],所以查詢速度優(yōu)于關系型數(shù)據庫,而且可以免費下載?;贚ucene的優(yōu)勢已有很多企業(yè)將其應用到自己的搜索引擎中,如Eclipse開發(fā)環(huán)境的內部搜索引擎就是用Lucene構建的。但由于Lucene自帶的中文分詞只能將中文切成單字不能實現(xiàn)詞語的切分,因此,符合需求的中文分詞器有待人們去開發(fā),并將其加入中文分詞模塊來實現(xiàn)更高效的檢索。
1 全文檢索引擎Lucene
1.1 Lucene簡介

    Lucene是apache軟件基金會jakarta項目組的一個子項目[3],是一個開放源代碼的全文檢索引擎工具包,它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,它為數(shù)據訪問和管理提供了簡單的函數(shù)調用接口,可以方便地嵌入到各種應用中,實現(xiàn)針對應用的全文索引/檢索功能。
  Lucene的API接口設計得可以通用,輸入輸出結構都很像數(shù)據庫的表?圯記錄?圯字段,所以很多傳統(tǒng)的應用文件、數(shù)據庫等都可以方便地映射到Lucene的存儲結構/接口中。總體上看,可以先把Lucene當成一個支持全文索引的數(shù)據庫系統(tǒng)。
1.2 Lucene系統(tǒng)結構
    Lucene系統(tǒng)結構[2]如圖1所示。從圖1中可以看到,Lucene的系統(tǒng)由基礎結構封裝、索引核心、對外接口三大部分組成。其中,直接操作索引文件的索引核心又是系統(tǒng)的重點。Lucene將所有源碼分為7個模塊(在Java語言中以包來表示),各個模塊所表示的系統(tǒng)部分見圖1。需要說明的是:org.apache.lucene.queryPaser是org.apache.lucene.search的語法解析器,不被系統(tǒng)之外實際調用,因此沒有當作對外接口看待。從面向對象的觀點來考慮,Lucene應用了最基本的一條程序設計準則:引入額外的抽象層以降低耦合性。首先,引入對索引文件的操作org.apache.lucene.store的封裝,然后將索引部分的實現(xiàn)建立在org.apache.lucene.index之上,完成對索引核心的抽象。在索引核心的基礎上開始設計對外的接口org.apache.lucene.search及org.apache.lucene.analysis。

 


1.3 Lucene程序運行機制
  Lucene系統(tǒng)功能強大,實現(xiàn)復雜,但從根本上主要包括2個主要功能:(1)建立索引庫[4],也就是將待索引的純文本內容經切分詞后索引入庫;(2)檢索索引庫,即根據查詢條件從索引庫中找出符合條件的文檔。
  在研究建立索引庫時首先要知道如圖2所示的Lucene索引機制的架構。
    從圖2可以看出,Lucene索引過程分為3個主要操作階段:將數(shù)據轉換成文本;分析文本;將分析過的文本保存到索引庫中。首先,Lucene使用各種解析器對各種不同類型的文檔進行解析,如對于HTML文檔,HTML解析器會做一些預處理的工作,過濾文檔中的HTML標簽等,然后輸出文本內容,接著Lucene的分詞器從文本內容中提取出索引項以及相關信息。


  檢索索引庫的運行邏輯如下:
  (1)輸入查詢條件,如用戶希望查詢到含有詞“編程”和“入門”但不含詞“Java”的記錄,則輸入條件為“編程+入門-Java”;查詢條件輸入搜索器(lucene.search),搜索器里有1個查詢解析器(lucene.queryParser),搜索器調用這個查詢解析器來解析查詢條件。
    (2)查詢條件“編程+入門-Java”被傳送到查詢解析器中,解析器將對“編程+入門-Java”進行分析,首先分析器解析字符串的連接符,即加號和減號,然后調用語言解析器(lucene.analysis)對每個詞進行切詞,一般英文將按空格來切詞,最后得到的查詢條件表示為:“編程”AND“入門”AND NOT“Java”。
    (3)查詢器根據查詢條件檢索事先已建立好的索引庫,得到查詢結果,并返回結果集lucene.search.Hits,Hits類似于JDBC中的ResultSet。
2 中文分詞
    因為Lucene提供的兩個中文分析器(ChineseAnalyzer和CJKAnalyzer)只能將中文切成單漢字,這對于絕大多數(shù)中文用戶來說很不方便,因此有必要開發(fā)適合自己的中文分析器。本系統(tǒng)基于字符串匹配的分詞技術實現(xiàn)了一個中文分詞器。它是按照一定的策略將待分析的漢字串與1個“充分大的”詞庫中的詞條進行匹配。若在詞庫中找到某個字符串則匹配成功(識別出1個詞)。按照掃描方向的不同,串匹配分詞方法[5]可以分為正向匹配和逆向匹配;按照不同長度優(yōu)先匹配的情況,可以分為最大(最長)匹配和最小(最短)匹配。本研究使用的方式是采用基于字典的雙向匹配算法,即需要進行正向和逆向2次匹配。傳統(tǒng)的方法都是先進行1次正向匹配,然后再進行逆向匹配,每次只有1個方向在進行匹配,而另1個方向的匹配過程需要第1個結束后才開始。本文的設計方法是把多線程技術引入到中文分詞程序當中[6]。因此可以在正向匹配時,同時并發(fā)地執(zhí)行逆向匹配,提高了運行速度和執(zhí)行效率。以下為正向匹配和逆向匹配都將調用的核心程序:
    載入處理完的文本,以字符數(shù)組的形式存儲起來。建立2個方法:(1)查找在文本中出現(xiàn)的詞,并且返回詞的長度;(2)用來統(tǒng)計詞出現(xiàn)的次數(shù)和控制程序進度。
    方法1:public int zhaoCi(char[] ch,int juli,TreeMap[] tmp)。
    ch數(shù)組表示的是文本內容,juli是詞的長度, TreeMap數(shù)組存儲不同長度的詞。
    方法2:public synchronized void ciPinTongJi(HashMaphm,char[]ch,int size,TreeMap[] tmp)。
    方法2是并發(fā)執(zhí)行的,正反匹配都需要這個方法。HashMap存儲字典中詞的第1個字,ch數(shù)組表示的是文本內容,size是文件的長度,TreeMap是數(shù)組存儲不同長度的詞,按照2個字、3個字、多個字的存儲順序存儲; 而且方法2是對外的接口,方法2調用方法1,并利用方法1返回的結果得到分詞的結果和詞頻結果。當從文本讀入1個字時,使用contain( )來判斷HashMap中是否存在這個字的映射,如果存在就取得長度等于字典中最長詞的一段內容,在TreeMap數(shù)組中進行查找,如果在TreeMap中找到對應的映射則對應的鍵值加1,輸出時在詞后面加上分割符號‘\’,然后繼續(xù)重復前面的步驟,直到文件結束,退出;如果TreeMap中不存在,那么i+1,讀取下一個字,重復前面的步驟,直到文件的結尾,退出,程序結束。
  正向匹配程序流程圖如圖3所示。    

3 全文檢索引擎Lucene的應用
  Lucene本身只是一個組件,若想讓Lucene真正起作用,還得在Lucene基礎上進行必要的2次開發(fā)[7]。下面的方案是對Lucene的應用研究,在本系統(tǒng)實現(xiàn)過程中要解決的關鍵問題有:數(shù)據加工及文本數(shù)據庫的實現(xiàn);全文數(shù)據索引;全文數(shù)據檢索和結果處理。
3.1 運行環(huán)境
  操作系統(tǒng):Windows NT/2000/xp;開發(fā)語言:Java、JSP;開發(fā)環(huán)境:MyEclipse6.5;API插件:Lucene2.3.2(Jakarta Lucene是一套免費的開放源代碼,由 Apache Jakarta開發(fā));Web服務器:Apache的Tomcat6.0。
  Lucene在Java環(huán)境下運行,因此首先要安裝jdk并設置環(huán)境變量JAVA_HOME,還要安裝tomcat6.0。到Lucene的官方網站http://jakarta.apache.org/Lucene/下載1份拷貝(筆者下載的是最新版2.3.2),下載后將得到一個名為lucene-2.3.2.zip和apache-ant-1.7.0-bin.zip的壓縮文件,將其解壓即可。
3.2 系統(tǒng)結構
  該應用分為3部分:(1)數(shù)據庫發(fā)布平臺,包括服務器、Java環(huán)境、Lucene API、中文分詞模塊;(2)HTML文件倒排檔生成系統(tǒng);(3)服務器端執(zhí)行的JSP程序和用戶界面。系統(tǒng)結構如圖4所示。

 

3.3 Lucene的擴展
  對于Lucene組件包,為了能夠支持中文,要進行修改。首先將改寫后支持中文的分析包IKAnalyzer.jar加入到發(fā)布包Analysis包中。解開Lucene.zip,在解開的目錄src\demo\org\apache\Lucene\demo下打開IndexHTML. java。在第1處“import org. apache. lucene. analysis. standard. StandardAnalyzer;”下面加1行“import org.apache. lucene. analysis. IKAnalyzer;”,把第2處“writer=new IndexWriter (index, new StandardAnalyzer (),create);”注釋掉,換成“writer=new IndexWriter(index,new ChineseAnalyzer(), create);”解開Luceneweb. War,釋放出configuration. jsp和result. jsp以及web. xml。編輯configuration. Jsp,找到indexLocation變量,賦值成“/index”(或者用戶自己建立的索引的目錄名稱);編輯result. Jsp,找到“Analyzer analyzer=new StopAnalyzer();”刪除或者注釋掉,改成“Analyzer analyzer=new org. apache. lucene. analysis. IKAnalyzer();”。這樣就擴展了Lucene的中文分詞的功能。
  Lucene并沒有規(guī)定數(shù)據源的格式,而只提供了1個通用的結構(Document對象)來接收索引的輸入,因此輸入的數(shù)據源可以是:數(shù)據庫、WORD文檔、PDF文檔、HTML文檔……,只要能夠設計相應的解析轉換器將數(shù)據源構造成Docuement對象即可進行索引。本設計實現(xiàn)了doc、ppt、xls、pdf、txt、xml解析轉換器將其文本信息提取出來。
3.4 搜索性能的比較
  經過多次測試取平均值,本設計在搜索主題信息的平均速度上比Google要快,雖然數(shù)量上不如Google檢索的多,但在信息符合度上明顯比其強。這樣就已經符合主題用戶,不一定要多只要精而且節(jié)省時間的需求,這對于當今效率優(yōu)先的市場來說是非常有競爭力的。應用Lucene的搜索引擎的檢索速度與計算機的配置有關,配置較好的計算機的搜索時間相對要少。以檢索關鍵字編程為例,Lucene與Google性能比較結果如表1所示。


    全文檢索引擎Lucene所構建的搜索引擎的搜索個數(shù)是由磁盤存儲的信息量的多少決定的,搜索時間除了第1次檢索有點慢,以后的時間耗費明顯少于通用搜索引擎。雖然通用搜索引擎提供的信息量大,但是并不是所有的信息都符合用戶的需求,用戶要在大量的信息中篩選有用的信息要花費大量的時間,可見主題搜索引擎的優(yōu)勢,本設計基本符合預期的結果。
    本文提出了一種解決中文全文檢索的方法,嵌入到Lucene中可以應用到搜索引擎、中小企業(yè)網站站內檢索、個人用戶桌面搜索引擎建立、特定文檔檢索數(shù)據庫建立等,從而實現(xiàn)對目標文檔方便地檢索管理,提高檢索效率。并且通過對全文檢索引擎Lucene的研究以及在Lucene API上的擴展,可以開發(fā)出多種應用程序,如:網站內容搜索系統(tǒng)、可檢索的郵件系統(tǒng)、海量文獻數(shù)據搜索系統(tǒng)。為了開發(fā)出性能指標更高的搜索引擎可以根據現(xiàn)有的排序算法或自定義排序算法自行開發(fā)結果排序模塊加入到Lucene中來進行測試比較,這些都有待于繼續(xù)研究。
參考文獻
[1] 聶頌.具有自動分類功能的主題搜索引擎的研究[D].天津:天津大學,2004:7-9.
[2] 車東.在應用中加入全文檢索功能——基于Java的全文索引引擎Lucene簡介[EB/OL].http://www.chedong.com/tech/lucene.html.2005-07.
[3] Lucene[EB/OL].2002.http://lucene.apache.org/java/docs/index.html.2002.
[4] 曹元大,賀海軍.全文檢索字索引技術的研究與實現(xiàn)[J].計算機工程,2002.28(6):286-288.
[5] 黃昌寧.中文信息處理中的分詞問題[J].語言文字應用,1997(1):72-78.
[6] 李志蜀,李果.中文搜索引擎的原理剖析及開發(fā)實現(xiàn)技術[J].計算機應用研究,2001(11):98-101.
[7] 肖創(chuàng)柏.基于全文檢索技術的商業(yè)信函處理系統(tǒng)的設計與實現(xiàn)[J].計算機應用研究,2004(1):150-152.
 

此內容為AET網站原創(chuàng),未經授權禁止轉載。