企業(yè)erp系統(tǒng)有哪些 基于Lucene的Web站點站內(nèi)全文檢索系統(tǒng)的設(shè)計與實現(xiàn)
發(fā)布時間:2020-03-07 來源: 散文精選 點擊:
〔摘要〕設(shè)計一個基于開源檢索工具包Lucene的Web站點站內(nèi)全文檢索系統(tǒng),詳述系統(tǒng)的設(shè)計思路與體系架構(gòu),并對中英文分詞和添加文檔索引等關(guān)鍵技術(shù)給出具體代碼和實現(xiàn)步驟 ;最后對該系統(tǒng)進行簡單的性能測試并與通用搜索引擎的檢索結(jié)果進行查全率和查準率方面的比較。
〔關(guān)鍵詞〕Lucene 全文檢索 搜索引擎
〔分類號〕TP393.07
Design and Implementation of a Website Full-text Retrieval System Based on Lucene
Cao Qiang
Library of Center for Chinese and American Studies, Nanjing University, Nanjing210093
〔Abstract〕The paper designs a full-text retrieval system based on Lucene which can be employed in websites, elaborates on the design methods and the structure of the system, and presents major codes of key technologies such as segmentation of Chinese words, adding index to documents, etc. The paper also gives the results of system benchmark testing and comparing with the current universal search engine in aspects of recall and precision ratio.
〔Keywords〕Lucenefull-text retrievalsearch engine
1引言
對于Web站點來說,一個優(yōu)秀的站內(nèi)全文檢索系統(tǒng)是不可或缺的。通常有兩種方法:①使用通用的桌面搜索引擎如Google等提供的站內(nèi)搜索功能來檢索站點內(nèi)部數(shù)據(jù);②開發(fā)自己專用的站內(nèi)全文檢索系統(tǒng)。由于通用搜索引擎的索引更新較慢且針對性不強,因而第一種方法的檢索結(jié)果有可能不全,還容易出現(xiàn)“壞鏈接”,查全率和查準率都難以保證。所以對于數(shù)據(jù)更新較快的站點來說,一般采用的是第二種方法。開發(fā)自己專用的站內(nèi)全文檢索系統(tǒng)。
目前大多數(shù)的web站點都是采用“后臺數(shù)據(jù)庫管理系統(tǒng)+前臺活動頁面”的模式構(gòu)建,因而對于站內(nèi)信息的檢索,最直接的辦法就是采用數(shù)據(jù)庫管理系統(tǒng)自帶的查詢命令(如:like ‘%keyword%’等)來實現(xiàn)檢索功能。但是由于這種模糊查詢并非基于索引,而是需要實時地遍歷整個數(shù)據(jù)庫紀錄中的文本字段進行匹配,因此其效率十分低下。當(dāng)數(shù)據(jù)量很大的時候,系統(tǒng)對查詢的響應(yīng)速度會越來越慢以至于讓人無法忍受。即使采用數(shù)據(jù)庫索引,但是目前數(shù)據(jù)庫的索引不是為文檔的全文檢索而設(shè)計的,因此其效率仍舊不高。
此外,對于少數(shù)未采用動態(tài)頁面和數(shù)據(jù)庫技術(shù)的站點來說,其采用的文檔格式,如文本文檔、word文檔、PDF文檔、HTML文檔,等等,并不像數(shù)據(jù)庫文檔那樣具備完整的查詢功能。如何對這部分文檔實現(xiàn)檢索,也是一個難題。
由上所述,如何構(gòu)建一個效率較高、針對性較強的通用型Web站點全文檢索系統(tǒng),是一個亟待解決的問題。筆者使用開放性的檢索平臺Lucene進行二次開發(fā),設(shè)計了一個全文檢索系統(tǒng),較為圓滿地解決了這個問題。
2關(guān)于Lucene
2.1Lucene簡介
Lucene是一個基于Java的全文信息檢索工具包,它不是一個完整的搜索應(yīng)用程序,而是為應(yīng)用程序提供索引和搜索功能。Lucene目前是Apache公司的一個開源項目,也是目前最為流行的基于Java的開源全文檢索工具包[1]。
Lucene的檢索本質(zhì)上仍屬于索引檢索,即用空間來換取時間,對需要檢索的文件、字符流進行全文索引,在檢索的時候?qū)λ饕M行快速的檢索,得到檢索位置,這個位置記錄檢索詞出現(xiàn)的文件路徑或者某個關(guān)鍵詞。
2.2選擇Lucene的原因
目前大部分的數(shù)據(jù)庫引擎都是用B樹結(jié)構(gòu)來維護索引,索引的更新會導(dǎo)致大量的I/O操作,Lucene在實現(xiàn)中對此稍微有所改進:不是維護一個索引文件,而是在擴展索引時不斷創(chuàng)建新的索引文件,然后定期地將這些新的小索引文件合并到原先的大索引中(針對不同的更新策略,批次的大小可以調(diào)整),這樣在不影響檢索的效率的前提下,提高了索引的效率。Lucene的索引結(jié)構(gòu)在概念上仍為傳統(tǒng)的倒排索引結(jié)構(gòu)[1]。
另外,相對于其它一些全文檢索系統(tǒng),Lucene還有以下優(yōu)點:①可以進行增量的索引(Append),可以對于大量數(shù)據(jù)進行批量索引,并且接口設(shè)計用于優(yōu)化批量索引和小批量的增量索引;②Lucene沒有定義具體的數(shù)據(jù)源,數(shù)據(jù)類型就是Lucene索引文件格式中用到的全部數(shù)據(jù)類型,由于他們都以字節(jié)為基礎(chǔ)定義而來,因此保證了與平臺無關(guān),這也是Lucene索引文件格式平臺無關(guān)的主要原因;③Lucene只提供一個通用的結(jié)構(gòu)(Document對象)來接受索引的輸入,因此可以非常靈活的適應(yīng)各種應(yīng)用,輸入的數(shù)據(jù)源可以是數(shù)據(jù)庫、Word文檔、PDF文檔和HTML文檔等,只要前端有合適的轉(zhuǎn)換器把數(shù)據(jù)源轉(zhuǎn)換成相應(yīng)結(jié)構(gòu)就可以進行數(shù)據(jù)索引了。
綜上所述,Lucene具備開放源代碼、跨平臺、數(shù)據(jù)源來源廣、索引效率高等特性,很適合于用來構(gòu)建全文檢索系統(tǒng)。
3原理與實現(xiàn)技術(shù)
3.1系統(tǒng)結(jié)構(gòu)分析
Lucene有兩個主要的服務(wù):索引和搜索。索引和搜索的任務(wù)是相互獨立的。索引和搜索服務(wù)都可用,這樣開發(fā)人員就可以對他們進行擴展來滿足自己的需求。文本索引是Lucene重點構(gòu)造的一個可搜尋的索引區(qū)域。索引是為高性能內(nèi)容查詢而創(chuàng)建的知識庫。Lucene提供豐富的API,可以與存儲在索引中的信息交互。用戶可以簡單地指定索引作為文檔名稱列表和它的摘要,也可以復(fù)雜地指定索引作為整個文檔存儲內(nèi)容和相關(guān)的附加元數(shù)據(jù)。例如可以按附加的元數(shù)據(jù)信息排隊,這樣在查詢結(jié)果中就可以區(qū)分出優(yōu)先級較高的一些文檔。同時,Lucene也支持“AND”、“+”、“OR”、“NOT”和“一”作為布爾運算符的查詢。Lucene功能強大,但從根本上說,主要包括兩塊:一是文本內(nèi)容經(jīng)分詞后索引入庫;二是根據(jù)查詢條件返回結(jié)果。(如圖所1示,其中最重要的兩個模塊是查詢分析器和語言分析器。)
要使用Lucene實現(xiàn)中英文混合檢索,①需要按詞法結(jié)構(gòu)來構(gòu)建相應(yīng)的詞法分析邏輯,實現(xiàn)Lucene在org.apache.lucene.analysis中定義的接口,為Lucene提供目標系統(tǒng)所使用的語言處理能力。Lucene已經(jīng)實現(xiàn)了英文和德文的簡單詞法分析邏輯(按照空格分詞,并去除常用的stopword(語法詞,如英語中的is,am,are,等等)。在這里,主要需要參考實現(xiàn)的接口在org.apache.lucene.analysis中的Analyzer.java和Tokenizer.java的定義,Lucene提供了很多英文規(guī)范的實現(xiàn)樣本,也可以作為實現(xiàn)時的參考資料。②按照被索引的文件格式來提供相應(yīng)的文本分析邏輯,這里是指除詞法分析之外的部分,比如HTML文件,通常需要把其中的內(nèi)容按照所屬域分門別類加入索引,這就需要從org.apache.lucene.document中定義的類document繼承,定義自己的HTMLDocument類,然后就可以交給org.apache.lucene.index模塊來寫入索引文件。完成了這兩步之后,Lucene全文檢索引擎就基本上完備了。
3.2Lucene的中英文分詞
由于語言特性(具備自然分隔符),英文分詞比較簡單。Lucene自帶的StopAnalyzer模塊,可以去除stopword,而且可以不區(qū)分大小寫,過濾掉各類標點符號和語法詞,足夠滿足一般檢索需要[2]。
對于中文分詞,新的Lucene1.9版本也提供了Standard-Analyzer中文分詞接口,不過它所采用的是基于單字的一元切分法。這種分詞方法雖然簡單實用而且不會損失任何索引信息,但同時也會產(chǎn)生許多無用索引,其直接后果就是用戶在最初的幾個返回頁面中很難找到自己的真正需要,而且對無用索引的維護也給系統(tǒng)增加了額外的開銷。
所以在中文分詞方面,筆者使用了中國科學(xué)院開發(fā)的ICTCLAS系統(tǒng)。ICTCLAS是一套廣受專家好評的漢語分詞系統(tǒng),該系統(tǒng)采用的算法為隱馬爾可夫模型,主要功能有中文分詞、詞性標注、未登錄詞識別,等等,是目前效率較高的一套中文分詞系統(tǒng)。ICTCLAS提供了JAVA接口,可以使用JNI(Java Native Interface)來調(diào)用,在兼容性上不存在任何問題[3]。
3.3中英文混合檢索的具體實現(xiàn)
在認真研究了Lucene的Analysis包、目前較好的分析器CJKAnalyzer以及ICTCLAS的JAVA接口以后,筆者編寫了一個基于雙字詞二元切分法的中文分析器。開發(fā)平臺基于JDK和Lucene1.5,使用JAVA語言實現(xiàn)。分析器的關(guān)鍵代碼如下:
public final class njuChineseAnalyzer extends Analyzer {
private Set stopwords;
/*構(gòu)造一個名為stopwords的字符串?dāng)?shù)列,該數(shù)列是自定義stopword(相對于Lucene本身定義的stopword來說)的列表?梢栽诖肆斜碇袛U展English stopwords和Chinese stopwords,只要將指定的stopword加入該數(shù)列即可。列表中的詞在文檔預(yù)處理時都會被自動過濾掉*/
public static final String[]STOP_WORDS =
{"a","an","and","are","as", "at", "be", "but", "by",……
"的","是","不",……};
以下是過濾器的主要代碼:
public njuChineseAnalyzer(){
stopwords = StopFilter.makeStopSet(STOP_WORDS);}
public njuChineseAnalyzer(String[] stopwords) {
this.stopwords = StopFilter.makeStopSet(stopwords);}
public TokenStream tokenStream(String fieldName, Reader reader) {
try{
ICTCLAS splitWord = new ICTCLAS();/*通過定義好的接口調(diào)用ICTCLAS分詞模塊*/[4]
String inputString = FileIO.readerToString(reader);
String resultString = splitWord.paragraphProcess(inputString);
return new StopFilter(new LowerCaseTokenizer(new StringReader(resultString)), stopwords);
}
catch (IOException e){
System.out.println("轉(zhuǎn)換出錯"); //異常處理
return null;}}
經(jīng)過對樣本文檔的處理測試,該分析器的分詞效果遠遠好于Lucene自帶的一元切分法分詞,繼承了ICTCLAS的高效率和高準確率。
3.4為文檔添加索引
目前的Web站點主要采用ASP+IIS或PHP+Apache的模式搭建,既有動態(tài)頁面,也包含靜態(tài)頁面,但在索引設(shè)計方面二者差別不大。下面以對動態(tài)PHP頁面進行索引為例,說明如何為文檔添加索引。關(guān)鍵代碼如下:
import java.io.File; /*調(diào)用JAVA系統(tǒng)模塊,還包括FileReader、BufferedReader、IOException、Date、DateFormat,使用同樣的語句調(diào)用*/
import org.apache.lucene.index.IndexWriter;/*調(diào)用Lucene模塊,還包括Document、Field、DateField,使用同樣的語句調(diào)用*/
import org.apache.lucene.analysis.njuChineseAnalyzer;//調(diào)用3.3所述的分析器模塊
文檔索引類定義如下:
class PHPDocIndexer
{
public static void main(String[] args throws ClassNotFoundException, IOException)
{
IndexWriter writer = new IndexWriter("/home/nio/indexes-phpdoc",
new NjuChineseAnalyzer(),true); //索引保存目錄,必須存在
indexDocs(writer,new File("/home/nio/phpdoc-zh")); //PHP文件保存目錄
……}
public static void indexDocs(IndexWriter writer,File file) throws Exception
{
System.out.print("Add file:" + file + " ...."); //添加文件
Document doc = new Document();
doc.add(Field.UnIndexed("file", file.getName()));? //索引文件名
doc.add(Field.UnIndexed("modified",DateFormat.getDateTimeInstance().format(new Date(file.lastModified()))));?//索引最后修改時間
while (line != null) {
content += line; //截取HTML標題<title>
doc.add(Field.Text("title", title)); //索引標題
status = "end";}}
doc.add(Field.Text("content", content.replaceAll("<[^<>]+>", "")));? //索引內(nèi)容
writer.addDocument(doc); //加入到現(xiàn)有索引中
……}}
結(jié)果輸出方面,設(shè)計了類似于Google的檢索輸出頁面,使用很方便。在Web服務(wù)器端加載Lucene之后,就可以提供站內(nèi)檢索服務(wù)了。
3.5測試及性能分析
為了測試該搜索引擎的性能,利用www.nuca.省略作為測試站點進行比較測試。該站點是南京市城市建設(shè)檔案館的Web站點,不但包含靜態(tài)網(wǎng)頁,還含有大量的動態(tài)網(wǎng)頁和數(shù)據(jù)庫文檔,可以作為測試的樣本。采取的方法是同時向Google站內(nèi)檢索和本文構(gòu)建的站內(nèi)引擎提交相同的5個查詢關(guān)鍵字,將兩者返回的搜索結(jié)果進行比較分析,其結(jié)果如表1所示。
本文構(gòu)建的站內(nèi)檢索引擎響應(yīng)速度較快,一般在2秒之內(nèi),而Google由于網(wǎng)絡(luò)因素等原因響應(yīng)時間較長,達到了5秒。就檢索結(jié)果來看,對于短關(guān)鍵詞,二者的查詢結(jié)果差別不大,但站內(nèi)引擎有響應(yīng)時間上的優(yōu)勢,而且可以順利拆分Google所不能拆分的中文詞;對于長關(guān)鍵詞,站內(nèi)檢索引擎的檢索結(jié)果較之Google,其查全率更高。但是另一方面,其查準率還是不夠好,對于關(guān)鍵詞的匹配不是很精確,還需要進一步調(diào)整分詞模塊的代碼,使其更好的匹配,以期取得更精確的查詢結(jié)果。
4結(jié)語
文章提出了一個適用于Web站點內(nèi)部信息全文檢索的解決方案,在Lucene的中文分詞和Web應(yīng)用方面作了一定的嘗試。未來將以此為基礎(chǔ),為搜索引擎增加語義分析模塊,提高搜索精度。在對其功能進行進一步擴充之后,本系統(tǒng)可以應(yīng)用到數(shù)據(jù)量較大的大中型網(wǎng)站站內(nèi)信息的檢索,較之傳統(tǒng)方法效率和準確率都有提高。采用的Lucene開發(fā)包屬于開放源代碼軟件,信息安全性較高;采用了成熟的ICTCLAS系統(tǒng)免費版本構(gòu)建分詞模塊,為企業(yè)網(wǎng)站節(jié)省了一筆開支;開發(fā)時使用的JAVA語言具有良好的通用性和跨平臺性。另外,還可將其應(yīng)用于個人用戶桌面搜索引擎的開發(fā)以及特定全文文檔檢索數(shù)據(jù)庫的構(gòu)建等方面。
參考文獻:
[1]Jakarta Lucene Home Page.[2006-04-30].http://Jakarta.省略/lucene/.
[2]陳士杰,張明杰.基于Lucene的英漢跨語言信息檢索.計算機工程,2005(13):62-64
[3]張華平.Chinese lexical analyzer ICTCLAS API manual.[2006-05-12].http://sewm.pku.省略/QA/reference/ICTCLAS/ICTCLAS_ API.htm.
[4]夏 天,樊孝忠,劉林.利用JNI實現(xiàn)ICTCLAS系統(tǒng)的Java調(diào)用.計算機應(yīng)用,2004(12):177-182
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。
相關(guān)熱詞搜索:站內(nèi) 檢索系統(tǒng) 站點 基于Lucene的Web站點站內(nèi)全文檢索系統(tǒng)的設(shè)計與實現(xiàn) 基于web排課系統(tǒng)的設(shè)計與實現(xiàn) 基于web的教學(xué)系統(tǒng)設(shè)計與實現(xiàn)
熱點文章閱讀