Lucene全文檢索系列(一)

1. Lucene簡介

Lucene是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎。Lucene以其方便使用、快速實施以及靈活性受到普遍的關注。它能夠方便地嵌入到各類應用中實現針對應用的全文索引、檢索功能。數據庫

 

2. lucene 的包結構

一、analysis對須要創建索引的文本進行分詞、過濾等操做apache

二、standard是標準分析器數組

三、document提供對Document和Field的各類操做的支持。架構

四、index是最重要的包,用於向Lucene提供創建索引時各類操做的支持框架

五、queryParser提供檢索時的分析支持函數

六、search負責檢索工具

七、store提供對索引存儲的支持優化

八、util提供一些經常使用工具類和常量類的支持對象

Lucene中的類主要組成以下:索引

1)org.apache.1ucene.analysis語言分析器,主要用於的切詞Analyzer是一個抽象類,管理對文本內容的切分詞規則。

2)org.apache.1uceene.document索引存儲時的文檔結構管理,相似於關係型數據庫的表結構。

3)document包相對而言比較簡單,該包下面有3個類,document相對於關係型數據庫的記錄對象,Field主要負責字段的管理。

4)org.apache.1ucene.index索引管理,包括索引創建、刪除等。索引包是整個系統核心,全文檢索的根本就是爲每一個切出來的詞建索引,查詢時就只須要遍歷索引,而不須要去正文中遍歷,從而極大的提升檢索效率。

5)org.apache.1ucene.queryParser查詢分析器,實現查詢關鍵詞間的運算,如與、或、非等。

6)org.apache.1ucene.search檢索管理,根據查詢條件,檢索獲得結果。

7)org.apache.1ucene.store數據存儲管理,主要包括一些底層的I/0操做。

8)org.apache.1ucene.util一些公用類。

 

3. Document文檔

1)void add(Field field) 往Document對象中添加字段

2)void removeField(String name)刪除字段。若多個字段以同一個字段名存在,則刪除首先添加的字段;若不存在,則Document保持不變

3)void removeFields(String name)刪除全部字段。若字段不存在,則Document保持不變

4)Field getField(String name)若多個字段以同一個字段名存在,則返回首先添加的字段;若字段不存在,則Document保持不變

5)Enumeration fields()返回Document對象的全部字段,以枚舉類型返回

6)Field [] getFields(String name)根據名稱獲得一個Field的數組

7)String [] getValues(String name)根據名稱獲得一個Field的值的數組

Document doc1 = new Document();

doc1.add(new Field("name", "word1 word2 word3",Field.Store.NO,Field.Index.TOKENIZED));

Document doc2 = new Document();

doc2.add(new Field("name", "word1 word2 word3",Field.Store.NO,Field.Index.TOKENIZED));

4. Field字段

new  Field("name", "word1 word2 word3",Field.Store.YES,Field.Index.TOKENIZED)

(1)store類有3個公有的靜態屬性:

Store.NO:表示該Field不須要存儲

Store.YES:表示該Field須要存儲

Store.COMPRESS:表示用壓縮方式來保存這個Field的值

(2)index類有4個公有的靜態屬性:

Index.NO:不須要索引

Index.TOKENIZED:先被分詞再被索引

Index.UN_TOKENIZED:不對該Field進行分詞,但會對它進行索引

Index.NO_NORMS:對該Field進行索引,可是不使用Analyzer,同時禁止它參加評分,主要是爲了減小內存的消耗。

(3)Field類的構造方法

public  Field(String name,String value,Store store,Index index);//直接的字符串方式

public  Field(String name,String value,Store store,Index index,TermVector  termVector);

public  Field(String name,String value,Reader reader);//使用Reader從外部傳入

public  Field(String name,String value,Reader reader,TermVector termVector);

public  Field(String name,byte[] value,Store store)//使用直接的二進制byte傳入

當Field值爲二進制時,可使用Lucene的壓縮功能將其值進行壓縮。

5.索引文件格式

1).fnm格式  包含了Document中全部field名稱

2).fdt與.fdx格式  .fdt文件用於存儲具備Store.YES屬性的Field的數據;.fdx是一個索引,用於存儲Document在.fdt中的位置。

3).tis 與.tii格式  .tis文件用於存儲分詞後的詞條(Term),而.tii就是它的索引文件,它代表了每一個.tis文件中的詞條的位置。

4)deletable格式 文檔被刪除後,會首先在deletable文件中留下一個記錄,要真正刪除時,纔將索引除去。

5)複合索引格式 .cfs

使用IndexWriter的useCompoundFile()  默認爲True

6.Directory索引的存放位置

a)FSDirectory.getDirectory(path, true)第二個參數表示刪除掉目錄內原有內容

IndexWriter writer = new IndexWriter(FSDirectory.getDirectory(path, true), new StandardAnalyzer(), true);//刪除原有索引

FSDirectory fsDir=FSDirectory.getDirectory(path,true);

IndexWriter writer = new IndexWriter(fsDir, new StandardAnalyzer(), true);

bRAMDirectory在內存中存放,讀取速度快,但程序一運行結束,它的內容就不存在了

RAMDirectory ramDir=new RAMDirectory();

IndexWriter writer = new IndexWriter(ramDir, new StandardAnalyzer(), true);

IndexWriter writer = new IndexWriter(new RAMDirectory(), new StandardAnalyzer(), true);

7.優化索引

writer.optimize();

將磁盤上的多個segment進行合併,組成一個全新的segment。這種方法並不會增長建索時的速度,反而會下降建索的速度。因此應該在建完索引後在調用這個函數

8.索引的合併

RAMDirectory RAMDir=new RAMDirectory();

IndexWriter writer = new IndexWriter(RAMDir, new StandardAnalyzer(), true);//刪除原有索引

IndexWriter writer2=new IndexWriter(FSDirectory.getDirectory(path,true),new StandardAnalyzer(), true); 

writer.addDocument(doc1);

writer2.addDocument(doc2);

writer.close();

writer2.addIndexes(new Directory[]{RAMDir});

writer2.close();

注意:在合併前必定要先關閉要加的索引器。

9.Lucene的索引「鎖」

1.  write.lock

2.  commit.lock

 

更多精彩文章請關注 =》 我愛學框架

http://www.itframe.top/

相關文章
相關標籤/搜索