摘要:本文在充分實(shí)驗(yàn)的基礎(chǔ)上,利用Lucene技術(shù)實(shí)現(xiàn)了桌面批量文件全文搜索引擎,并通過檢測詞庫工具顯示Lucene索引數(shù)據(jù),闡述了全文搜索的工作原理。
關(guān)鍵詞:全文搜索;Lucene;IKAnalyze
Abstract:
In this paper,on the full experimental basis, using Lucene technology, achieves the full text of the desktop batch files search engine, and by detecting the thesaurus tool shows the Lucene index data, set the full-text search works.
Keywords: Full Text Retrieval;Lucene;IKAnalyze
1 搜索引擎的概述
搜索引擎是指根據(jù)一定的策略、運(yùn)用特定的計(jì)算機(jī)程序搜集互聯(lián)網(wǎng)上的信息,在對信息進(jìn)行組織和處理后,并將處理后的信息顯示給用戶,是為用戶提供檢索服務(wù)的系統(tǒng)。搜索引擎主要分為以下三類:
全文索引:全文索引引擎是名副其實(shí)的搜索引擎,國外代表有Google,國內(nèi)則有著名的百度搜索。它們從互聯(lián)網(wǎng)提取各個(gè)網(wǎng)站的信息(以網(wǎng)頁文字為主),建立起數(shù)據(jù)庫,并能檢索與用戶查詢條件相匹配的記錄,按一定的排列順序返回結(jié)果。
目錄索引:目錄索引是按目錄分類的網(wǎng)站鏈接列表。用戶可以按照分類目錄找到所需要的信息,不依靠關(guān)鍵詞(Keywords)進(jìn)行查詢。目錄索引中最具代表性的是大名鼎鼎的Yahoo、新浪分類目錄搜索。
元搜索引擎:元搜索引擎接受用戶查詢請求后,同時(shí)在多個(gè)搜索引擎上搜索,并將結(jié)果返回給用戶。
2 全文搜索引擎的工作原理
全文搜索引擎的工作原理如圖1所示。
具體工作過程如下:
(1)抓取網(wǎng)頁。
每個(gè)獨(dú)立的搜索引擎都有自己的網(wǎng)頁抓取程序(spider)。Spider順著網(wǎng)頁中的超鏈接,連續(xù)地抓取網(wǎng)頁。被抓取的網(wǎng)頁被稱之為網(wǎng)頁快照。由于互聯(lián)網(wǎng)中超鏈接的應(yīng)用很普遍,理論上,從一定范圍的網(wǎng)頁出發(fā),就能搜集到絕大多數(shù)的網(wǎng)頁,并把網(wǎng)頁存放到本地文件系統(tǒng)中。
(2)處理網(wǎng)頁。
搜索引擎抓到網(wǎng)頁后,然后是提取關(guān)鍵詞和文件內(nèi)容,建立索引文件,還包括去除重復(fù)網(wǎng)頁、中文分詞、判斷網(wǎng)頁類型、分析超鏈接、計(jì)算網(wǎng)頁的重要度/豐富度等,并將索引表保存到專用數(shù)據(jù)庫中。
(3)提供檢索服務(wù)。
用戶輸入關(guān)鍵詞進(jìn)行檢索,搜索引擎從索引數(shù)據(jù)庫中找到匹配該關(guān)鍵詞的網(wǎng)頁;為了用戶便于判斷,除了網(wǎng)頁標(biāo)題和URL外,還會提供一段來自網(wǎng)頁的摘要以及其他信息。
3 Lucene和IKAnalyzer技術(shù)
Lucene是Java領(lǐng)域的全文搜索的工具包,它不僅可以對文本數(shù)據(jù)進(jìn)行搜索,還可以對HTML、Excel和PDF等格式的文件建立索引并且進(jìn)行搜索,它不但提供了基于Java索引和搜索技術(shù),而且還提供了拼寫檢查、高級分析功能。它能夠建立全文索引庫,并對索引內(nèi)容進(jìn)行搜索。但它不提供爬蟲程序和“PageRank”等排序算法。
IKAnalyzer是一個(gè)開源的,基于java語言開發(fā)的輕量級的中文分詞工具包,它采用了多子處理器分析模式,支持英文字母(IP地址、Email、URL)、數(shù)字(日期,常用中文數(shù)量詞,羅馬數(shù)字,科學(xué)計(jì)數(shù)法),中文詞匯(姓名、地名處理)等分詞處理。
4 Lucene全文搜索引擎的實(shí)現(xiàn)機(jī)制
Lucene主要包括兩個(gè)重要功能:一是對搜索內(nèi)容建立索引庫,對待索引的純文本內(nèi)容經(jīng)切分詞后的索引入庫;二是檢索索引庫,即根據(jù)查詢條件從索引庫中找出符合條件的文檔,搜索時(shí)用二元搜索算法快速定位關(guān)鍵字,找到匹配的關(guān)鍵字,查出相對性的文檔的位置,實(shí)現(xiàn)檢索。圖2是Lucene全文索引及檢索過程示意圖。
(1)Lucene中與索引相關(guān)的類有如下幾類。
Analyzer類:詞法分析器,對文本資源進(jìn)行切分。將文本按規(guī)則切分為一個(gè)個(gè)可以進(jìn)行索引的最小單位(關(guān)鍵字)。一段有意義的文字需要通過Analyzer分割成一個(gè)個(gè)詞語后才能按關(guān)鍵詞搜索。
IndexWriter類:用于創(chuàng)建索引文件。
Analyzer:語言分析器,用于分析搜索引擎遇到的各種文件。
Document類:索引文件的存儲結(jié)構(gòu),一個(gè)Document代表索引庫中的一條記錄,要搜索的信息封裝成Document后通過IndexWriter寫入索引庫。類似于數(shù)據(jù)庫表中每一條記錄。
Filed類:一個(gè)Document可以包含多個(gè)列,叫做field。創(chuàng)建Document對象以后,可以通過Document的add方法增加這些列。類似于數(shù)據(jù)庫表中的每一個(gè)字段。
(2)Lucene中與檢索相關(guān)的類有如下幾類。
IndexSearcher類:在索引庫中檢索的類。
QueryParser:查詢分析器,是一個(gè)解析查詢字符串的類,生成Query對象。
Query:用于搜索的類。
TopDocs:返回搜索結(jié)果集的類,由匹配的Document組成。
5 搜索引擎索引庫的建立和檢索
(1)本實(shí)驗(yàn)對e:\\source文件下196個(gè)文件建立索引表,源代碼如下。
public static void index() throws Exception {
//指定索引文件存放位置
File file = new File(\"e:\\\\index1\");
Directory dir = FSDirectory.open(file);
//指定語言分詞器,IKAnalyzer為中文分詞器工具包
Analyzer an = new IKAnalyzer();
//用指定的索引文件位置,語言分詞器構(gòu)造新的寫索引器
IndexWriter writer = new IndexWriter(dir, an, true,IndexWriter.MaxFieldLength.UNLIMITED);
//設(shè)置索引源文件路徑
File path = new File(\"e:\\\\source\");
String[] filenames = path.list();
for (int i = 0; i < filenames.length; i++) {
File f = new File(\"e:\\\\source\\\\\"+filenames[i]);
/*構(gòu)造包含3個(gè)字段的Document對象
* filename字段,子存儲,不索引
* path字段,只存儲,不索引
* content字段,進(jìn)行全文索引*/
Document doc = new Document();
Field f1 = new Field(\"filename\", f.getName(), Field.Store.YES,
Field.Index.NOT_ANALYZED);
Field f2 = new Field(\"path\", f.getPath(), Field.Store.YES,
Field.Index.NOT_ANALYZED);
Field f3 = new Field(\"content\", new FileReader(f));
doc.add(f1);
doc.add(f2);
doc.add(f3);
writer.addDocument(doc); }
writer.optimize();
writer.close();
System.out.println(\"create index finish....\"); }
通過Luck工具查看索引文件,得到如圖3所示的索引文件概況。
在圖的左邊顯示了三個(gè)Fileds的數(shù)量以及所占的比例。比如:進(jìn)行全文分詞后有143759個(gè)分詞,文件數(shù)量是196。在圖的右邊顯示中英文分詞后的Text,以及它所屬于的Field、文件和編號No.選擇其中的“幼兒園”進(jìn)行搜索,單擊右鍵選擇“Show all term docs”顯示如圖4所示的搜索界面,從圖中可以看出搜索到54個(gè)文檔,并顯示文件名和路徑。
從圖中得知,索引文件結(jié)構(gòu)為倒排索引。它以關(guān)鍵字為標(biāo)準(zhǔn)建立索引的,描述了一個(gè)單詞在所有文檔中的出現(xiàn)情況,是一種“單詞到文檔”的映射關(guān)系。它由若干段(segment)組成,每個(gè)段由若干的文檔(document)組成,每個(gè)文檔由若干的域(field)組成,每個(gè)域由若干項(xiàng)(term)組成。
(2)編寫搜索代碼,以搜索“幼兒園”內(nèi)容為例,得到圖5所示的結(jié)果。
public static void search() throws Exception{
//設(shè)置索引文件所在的目錄
Directory dir=FSDirectory.open(new File(\"e:\\\\index1\"));
//創(chuàng)建指向索引目錄的搜索器
IndexSearcher is=new IndexSearcher(dir);
Analyzer a=new IKAnalyzer();
//創(chuàng)建查詢解析器,使用和索引相同的語言分析器
QueryParser parser=new QueryParser(Version.LUCENE_30,\"content\",a);
Query query=parser.parse(\"幼兒園\");
//獲取開始搜索時(shí)間
long start=System.currentTimeMillis();
TopDocs docs=is.search(query, 100);
//獲取搜索結(jié)束時(shí)間
long end=System.currentTimeMillis();
System.out.println(\"search time is :\"+(end-start)+\"毫秒\");
System.out.println(\"搜索到的文件總數(shù)有:\"+docs.totalHits);
ScoreDoc[] sds=docs.scoreDocs;
for(int i=0;i int docId=sds[i].doc; Document doc=is.doc(docId); System.out.println(doc.get(\"filename\")); } is.close(); }. 6 總結(jié) 通過實(shí)驗(yàn),實(shí)現(xiàn)了桌面批量文件的搜索功能,并闡述了倒排索引的特點(diǎn),了解了全文搜索引擎的工作原理。 參考文獻(xiàn) [1] MICHAEL B,DORON C.lucene. http://lucene.apache.org/java/docs/,2007-6-14/2007-7-20 [2] 管建和. 基于Lucene全文檢索引擎的應(yīng)用研究和實(shí)現(xiàn)[J]. 計(jì)算機(jī)工程與設(shè)計(jì),2007,(2) [3] 潘以峰. 基于Lucene的網(wǎng)站全文檢索系統(tǒng)的開發(fā)[J]. 廣西教育學(xué)院學(xué)報(bào),2006,(5)