黃少林 王 華 張玉紅 蔣一峰
〔摘 要〕索引系統(tǒng)是搜索引擎的數(shù)據(jù)大本營,在搜索引擎發(fā)展早期,能夠索引的網(wǎng)頁數(shù)量代表了整個行業(yè)的技術(shù)發(fā)展水平。Lucene全文檢索技術(shù)是信息檢索領(lǐng)域廣泛使用的基本技術(shù),它是一個優(yōu)秀的開源全文本搜索技術(shù)框架,本文詳細分析了索引系統(tǒng)相關(guān)技術(shù)和Lucene的索引系統(tǒng)結(jié)構(gòu)。
〔關(guān)鍵詞〕搜索引擎;索引;lucene;倒排索引
〔中圖分類號〕TP393.09 〔文獻標識碼〕A 〔文章編號〕1008-0821(2009)07-0169-03
The Design and Implementation of Indexing System Based on LuceneHuang Shaolin Wang Hua Zhang Yuhong Jiang Yifeng
(School of Information Engineering,Capital Normal University,Beijing 100037,China)
〔Abstract〕Index system is the data center of the search engine,at the beginning of the search engine,the number of the pages that can be indexed to represent the technology level of the whole industry.Lucene full-text retrieval,as a basic skill,is widely used in the field of information retrieval;it is an excellent open-source full-text search technology framework.The paper analyzed Lucenes indexing system structure in detail and gave some introduction about the related technology of index system.
〔Key words〕search engine;index;lucene;inverted index
無論在工業(yè)界還是在學術(shù)界,搜索引擎一致地被認為分為下載、分析、索引和查詢四大系統(tǒng),這四大系統(tǒng)相互配合共同實現(xiàn)搜索引擎的快、全、準、穩(wěn)的四大需求。索引系統(tǒng)是搜索引擎最核心的模塊之一,索引過程就是將普通的文檔形式轉(zhuǎn)換為可快速檢索的索引形式。例如,書目包含的目錄。其中每一條目就是一個索引,用來標識某個章節(jié)的頁碼,幫助讀者快速瀏覽,索引就是這樣一個短小精煉的檢索信息的信息。
1 lucene及索引技術(shù)介紹
1.1 lucene介紹
Lucene是apache軟件基金會jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構(gòu),提供了完整的查詢引擎和索引引擎,它為數(shù)據(jù)訪問和管理提供了簡單的函數(shù)調(diào)用接口,可以方便的嵌入到各種應用中實現(xiàn)針對應用的全文索引/檢索功能。Lucene的API接口設(shè)計得比較通用,輸入輸出結(jié)構(gòu)都很像數(shù)據(jù)庫的表、記錄和字段,所以很多傳統(tǒng)的應用的文件、數(shù)據(jù)庫等都可以比較方便的映射到Lucene的存儲結(jié)構(gòu)或接口中??傮w上看,可以先把Lucene當成一個支持全文索引的數(shù)據(jù)庫系統(tǒng)。
1.2 索引技術(shù)
索引是在搜索時使用到的一種特殊的數(shù)據(jù)結(jié)構(gòu)。當文檔的數(shù)量相當龐大,并且這些文檔中的信息相對穩(wěn)定時,建立索引可以大大提高搜索時的效率。在使用索引進行查找時,首先對需要索引的文檔進行預處理,建立關(guān)于這些文檔的索引結(jié)構(gòu)。索引技術(shù)主要有以下3種:倒排索引,后綴數(shù)組和簽名文件。其中,倒排索引技術(shù)在當前大多數(shù)的信息檢索系統(tǒng)中得到了廣泛的應用,它對于關(guān)鍵詞的搜索非常有效,在lucene中也是使用的這種技術(shù)。后綴數(shù)組技術(shù)在短語查詢中具有很快的速度,但是這樣的數(shù)據(jù)結(jié)構(gòu)在構(gòu)造和維護時都比較復雜一些。簽名文件技術(shù)在20世紀80年代比較流行,但是后來倒排索引技術(shù)逐漸超越了它。
1.3 倒排索引技術(shù)
倒排索引是目前搜索引擎公司對搜索引擎最常用的存儲方式,也是搜索引擎的核心內(nèi)容,倒排索引源于實際應用中需要根據(jù)屬性的值來查找記錄。這種索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的地址。由于不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引。倒排索引是以關(guān)鍵字和文檔編號結(jié)合,并以關(guān)鍵字作為主鍵的索引結(jié)構(gòu)(見圖1)。下面利用一個例子來說明倒排索引:
比如說有兩個文檔,doc1和doc2他們的內(nèi)容分別如下:
Doc1:we are students。
Doc2:Are you student?
如果按照正常的索引建立如下所示:
文檔名關(guān)鍵字次數(shù)
Doc1we1
Doc1are1
Doc2student1
Doc2Are1
……
這里索引的建立是以文檔為標準的,這樣當文檔很多的時候數(shù)據(jù)量將非常的大,檢索效率會明顯下降的。
倒排索引是以單詞為標準來進行索引的建立的。
還以上面的doc1和doc2為例:
關(guān)鍵字出現(xiàn)的文檔次數(shù)
studentdoc21
wedoc11
Aredoc1 doc21?1
2 lucene索引建立
2.1 lucene索引結(jié)構(gòu)
Lucene的索引結(jié)構(gòu)在概念上即為傳統(tǒng)的倒排索引結(jié)構(gòu)。Lucene索引文件的概念組成和結(jié)構(gòu)組成見圖2。
Lucene索引index由若干段(segment)組成,每一段由若干的文檔(document)組成,每一個文檔由若干的域(field)組成,每一個域由若干的項(term),組成。項是最小的索引概念單位,它直接代表了一個字符串以及其在文件中的位置、出現(xiàn)次數(shù)等信息。域是一個關(guān)聯(lián)的元組,由一個域名和一個域值組成,域名是一個字串,域值是一個項,比如將“標題”和實際標題的項組成的域。文檔是提取了某個文件中的所有信息之后的結(jié)果,這些組成了段,或者稱為一個子索引。子索引可以組合為索引,也可以合并為一個新的包含了所有合并項內(nèi)部元素的子索引。
2.2 lucene索引的建立
建立索引是使用搜索引擎的第一步,從整體上看,lucene建立索引的過程有以下4步(見圖3):提取文本、構(gòu)建Document、分析、建立索引。下面分別從這4個方面進行分析。
2.2.1 提取文本
為了使用Lucene對文檔數(shù)據(jù)建立索引,第一步就是要把這些需要建立索引的文檔數(shù)據(jù)轉(zhuǎn)換成lucene可以處理的類型。假設(shè)現(xiàn)在的任務是對一系列PDF文檔數(shù)據(jù)建立索引。首先為了使lucene能夠?qū)@些文檔數(shù)據(jù)建立索引,必須想辦法從這些PDF文檔中提取文本信息,并且使用這些提取出來的信息構(gòu)建lucene中的Document文檔和Field。同樣,當我們需要對word文檔或者其它類型的文檔建立索引時也面臨著類似的問題。
2.2.2 構(gòu)建Document
構(gòu)建Document是索引建立的第二步。這一目的就是將前面所提取出來的文本組裝成lucene可以識別的格式來為索引的建立做準備。
2.2.3 分析并建索引
在提取了需要lucene建立索引的數(shù)據(jù)并且構(gòu)建了Document之后,接下來就可以調(diào)用IndexWriter類的addDocument()方法來使lucene建立索引了。在這樣的調(diào)用中,lucene會首先對所要建立索引的數(shù)據(jù)進行分析以使得在建立索引時可以更加容易地處理這些數(shù)據(jù),然后索引器會按lucene所規(guī)定的索引格式將數(shù)據(jù)寫人索引文件。
2.3 lucene創(chuàng)建索引代碼
public static void CreateIndex(File indexDir)
throws IOException
{
IndexWriter writer=new
IndexWriter(sDir,new
StandardAnalyzer(),true);
∥參數(shù)sDir是存放索引的目錄。創(chuàng)建索引最重要的類是IndexWriter,其構(gòu)造器有3個參∥數(shù),第1個參數(shù)指定了存儲索引文件的路徑。第2個參數(shù)指定了在索引過程中使用什么∥樣的分詞器。第3個參數(shù)是個布爾變量,用于控制是重建索引,還是復用原有索引。
for(int i=0;i { Document doc=new Document();∥初始化一個Document Product product=(Product)prodList.get(i); File Field_name=Field.Text(“Field_name”,product.getFieldName);∥建立一個Field_name字段 Field Field_desc=Field.Text(“Field_desc”,product.getFieldDesc);∥建立一個Field_desc字段 doc.add(Field_name);∥將字段添加至這個Document doc.add(Field_desc);∥將字段添加至這個Document writer.addDocument(doc);∥將這個Document寫入索引 } writer.optimize();∥索引優(yōu)化 writer.close();∥關(guān)閉這個 indexWriter } 首先創(chuàng)建了類Document的一個實例,它由1個或者多個的域組成。你可以把這個類想象成代表了一個實際的文檔,比如1條數(shù)據(jù)庫記錄,1個HTML頁面,1個PDF文檔,或者1個文本文件。而類Document中的域一般就是實際文檔的一些屬性。我們可以用不同類型的Field來控制文檔的哪些內(nèi)容應該索引,哪些內(nèi)容應該存儲。其次向文檔中添加域,每個域包含兩個屬性,分別是域的名字和域的內(nèi)容。在我們的例子中域的名字分別是Field_name和Field_desc。最后把準備好的文檔添加到了索引當中。當把索引文檔都添加到索引中后,要關(guān)閉索引,這樣才保證lucene把添加的文檔寫回到硬盤上。 另外,在創(chuàng)建索引的工程中你可以充分利用機器的硬件資源來提高索引的效率當需要索引大量的文件時,索引過程的瓶頸是在往磁盤上寫索引文件的過程中。為了解決這個問題,lucene在內(nèi)存中持有一塊緩沖區(qū)。lucene的類IndexWriter提供了3個參數(shù)mergeFactor、minMergeDocs、maxMergeDocs用來調(diào)整緩沖區(qū)的大小以及往磁盤上寫索引文件的頻率。 Lucene提供了刪除索引的API可以刪除文檔,當需要更新文檔時可以通過先刪除再增加的方式來實現(xiàn)。這樣索引構(gòu)建模塊就能夠達到動態(tài)的更新索引的目的。 3 總 結(jié) 本文從lucene索引系統(tǒng)結(jié)構(gòu)出發(fā),分析了常用的索引相關(guān)技術(shù),并詳細闡述了一個基于lucene全文檢索系統(tǒng)的索引模塊設(shè)計以及實現(xiàn)。本文介紹的索引技術(shù)的實際應用可推廣至許多其它的應用實例的設(shè)計與實現(xiàn)中,從而實現(xiàn)對目標文檔的檢索管理,提高檢索效率。 參考文獻 [1]梁斌.走進搜索引擎[M].北京:電子工業(yè)出版社,2007.10(1). [2]李剛,宋偉,邱哲.Ajax+Lucene構(gòu)建搜索引擎[M].北京:人民郵電出版社,2006.4(1). [3]盧亮,張博文.搜索引擎原理、實踐與應用[M].北京:電子工業(yè)出版社,2007.9(1). [4]孫西全,馬瑞芳,李燕靈.基于Lucene的信息檢索的研究與應用[J].情報理論與實踐,2006,(1):125-128. [5]管建和,甘劍峰.基于Lucene全文檢索引擎的應用研究與實現(xiàn)[J].計算機工程與設(shè)計,2007,(2):489-491. [6]王莉云,王華,陳剛,等.基于lucene的全文檢索系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機工程與設(shè)計,2007,(24):5959-5961.