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