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