Lucene是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎。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一些公用類。
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));
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的壓縮功能將其值進行壓縮。
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
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);
writer.optimize();
將磁盤上的多個segment進行合併,組成一個全新的segment。這種方法並不會增長建索時的速度,反而會下降建索的速度。因此應該在建完索引後在調用這個函數
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();
注意:在合併前必定要先關閉要加的索引器。
1. write.lock
2. commit.lock
更多精彩文章請關注 =》 我愛學框架
http://www.itframe.top/