跳到主要內容區塊

計資中心電子報C&INC E-paper

技術論壇

免費開放原始碼搜尋引擎 Lucene簡介
  • 卷期:v0010
  • 出版日期:2009-09-20

作者:曾保彰 / 臺灣大學計算機及資訊網路中心資訊網路組


本文除了說明為何學校要有自己的搜尋引擎之外,也提供解決之道。從眾多免費的網路搜尋引擎之中,筆者為各位挑選出「Lucene」這個搜尋引擎。Lucene它是Apache軟體基金會[1]旗下的一個開放原始碼的全文檢索引擎。目地是為軟體開發人員提供一個簡單易用的工具套件,以方便在任何文件檔案系統中實現全文檢索的功能。

 

背景

既然有了Google、Yahoo或Bing等商業搜尋引擎(Search Engine),學校或公司是否有必要建立自己的搜尋引擎?的確會有,因為這些免費的搜尋引擎,一般是用來搜尋公開文件,對於公司或機關內不適合外露的文件或機密資料(如會議紀錄,公文或報表等)並不適用。當文件越來越多時,如何快速找到以前的歷史資料呢,就會是件麻煩。本文除了說明為何學校要有自己的搜尋引擎之外,當然也要提供解決之道。從在網路上有眾多免費的搜尋引擎之中,筆者為各位挑出「Lucene」這個搜尋引擎。Lucene它是Apache軟體基金會[1]旗下的一個開放原始碼的全文檢索引擊。目地是為軟體開發人員提供一個簡單易用的工具套件,以方便在任何文件檔案系統中實現全文檢索的功能。

 

為何學校需要建構自己的搜尋引擎

學校的網頁如果是公開的,要對其內容作搜尋,目前還是以Google為最佳選擇(市占率最高),包括站內搜尋,作法是在搜尋的標的加上site:網址,就可以針對這個網址內容作搜尋;如果是不公開的資訊或是需要認證後才能看的資料,例如在學校有圖書館藏書檢索,需要認證後才能看到留言版內容、公文或會議紀錄…等這些內容,通常學校都要另外向外採購搜尋服務。
像這些不適合外露的文件或機密資料大都在資料庫裏,所以程式設計師有可能採用SQL語言實現搜尋功能,然而,當遇到全文檢索時,資料庫搜尋的速度和性能就無法滿足需求了。因此,只要是學校有不適合外露的文件或機密資料,同時需要給很多人搜尋時,就有建置搜尋引擎的需求。

 

Lucene簡介

在介紹Lucene之前,我們先來介紹一下搜尋引擎的發展史:1994年由幾位Stanford大學生開發出對網際網路上的大量資料作更有效的檢索,這個搜尋引擎就是「Excite[2]」;同時,自己提供自家網頁簡介索引資訊,然後以分類目錄見長,這就是現在全球知名的Yahoo搜尋引撃的特色。同年,在Carnegie Mellon大學的麥克•馬丁博士(Dr.Michael Mauldin)創建了互聯網搜索引擎「Lycos[4]」;到了1996年,兩名史丹佛大學的理學博士生拉里•佩奇和謝爾蓋•布林開發了一個對網站之間的關係做精確分析的搜尋引擎[5],就是現在大家所熟知的「Google」。
這裏介紹的Lucene是一個支援全文檢索的開放工具,由Apache軟體基金會(也就是Apache Software Foundation,簡稱為ASF)支援開發。 Lucene 提供了一個簡單卻強大的應用程式介面,能夠做全文索引和搜尋。在Java開發環境裡,Lucene是一個成熟、免費的開放原始碼工具;就其本身而論,Lucene是現在並且是這幾年最受歡迎的免費Java資訊檢索程式庫。

 

如何建立索引與搜索

如何在伺服器上安裝Lucene,只要在Google搜尋”Java lucene”,應該可以找到成千上萬的安裝說明,這裏僅敍述筆者個人在安裝上的一些經驗,詳細的安裝步驟無法在此一一呈現。

  1. 首先開發環境要先安裝JAVA JDK 1.4.x 以上版本(Required),這部份可到http://java.sun.com/下載,下載後再安裝

  2. 再來取得Lucene程式碼,請至Apache網站[5]免費下載Lucene,個人是採用2.4.0版本作測試,所以選擇下載lucene-2.4.0.zip這個檔案。然後解壓縮Lucene2.4.0.zip後會看到二個重要的packages: lucene-core-2.0.0.jar及lucene-demos-2.0.0.jar,請加入這兩個檔到環境變數CLASSPATH裡。

  3. 接著我們可以作簡單的demo(取自[6]),在後面第一個程式碼是TxtFileIndex.java,它是作索引的程式,其中D:\\test_lucene\\text_directory是要作索引的文字檔(.txt)所在目錄位置,D:\\test_lucene\\index_directory是Lucene建立索引檔的目錄位置。第二個程式碼是TxtFileSercher.java,它是作Search的程式,這個程式要找的字串是queryStr = "test",它會把有“test”單字的檔案全部列出。

Art editor Img

Art editor Img

Art editor Img

Art editor Img

Art editor Img


中文化問題

因Lucene中文的索引預設的作法,是將每個字作索引,如以簡單句子為例:「我是台大人」,預設的分詞器會將之分割為五個中文字:「我、是、台、大、人」,CJKTokenizer(有人開發的分詞器)則會將之分割為「我是、是台、台大、大人」四個二節的詞,然後再作索引。

搜尋「台」或「台大」還可能在索引檔裏找得到,但是如果搜尋「台大人」則會找不到。這個問題的解決方法就必須重寫分詞器,筆者認為「我、是、台、大、人、我是、是台、台大、大人、我是台、是台大、台大人、我是台大、是台大人、我是台大人」都需要作索引,這樣會導致索引檔變大,但優點是搜尋時比較能找到所需要的資料;也有人認為沒意義的詞如「是台」「我是台」,會讓索引沒必要地增大、降低搜尋效率。筆者認為理想的方法是按詞語分割,如「我、是 、台大人」,但要完美地分割中文,實際上是很困難的,直到現在都一直有無數的研究希望能找到更有效的解決之道。


參考文獻

[1] http://zh.wikipedia.org/zh-tw/Apache%E8%BB%9F%E4%BB%B6%E5%9F%BA
%E9%87%91%E6%9C%83

[2] http://en.wikipedia.org/wiki/Excite
[3] http://zh.wikipedia.org/zh-hant/Lycos
[4] http://zh.wikipedia.org/zh-tw/Google
[5] http://lucene.apache.org/java/docs/
[6] http://gznofeng.javaeye.com/blog/196160