lucene是乙個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎。lucene以其方便使用、快速實施以及靈活性受到廣泛的關注。它可以方便地嵌入到各種應用中實現針對應用的全文索引、檢索功能。
1、analysis對需要建立索引的文字進行分詞、過濾等操作
2、standard是標準分析器
3、document提供對document和field的各種操作的支援。
4、index是最重要的包,用於向lucene提供建立索引時各種操作的支援
5、queryparser提供檢索時的分析支援
6、search負責檢索
7、store提供對索引儲存的支援
8、util提供一些常用工具類和常量類的支援
lucene中的類主要組成如下:
1)org.apache.1ucene.analysis語言分析器,主要用於的切詞analyzer是乙個抽象類,管理對文字內容的切分詞規則。
2)org.apache.1uceene.document索引儲存時的文件結構管理,類似於關係型資料庫的表結構。
3)document包相對而言比較簡單,該包下面有3個類,document相對於關係型資料庫的記錄物件,field主要負責欄位的管理。
4)org.apache.1ucene.index索引管理,包括索引建立、刪除等。索引包是整個系統核心,全文檢索的根本就是為每個切出來的詞建索引,查詢時就只需要遍歷索引,而不需要去正文中遍歷,從而極大的提高檢索效率。
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);
writer2.close();
注意:在合併前一定要先關閉要加的索引器。
1. write.lock
2. commit.lock
lucene 全文檢索
在講全文檢索之前,先說下資訊檢索。資訊檢索通俗的講,就是從資訊集合中找出與使用者相關的資訊,除了文字之外,還有音訊 影象等。全文檢索 把使用者的查詢請求和全文中的每個詞進行比較,不考慮查詢請求與文字語義上的匹配。b 全文檢索是指計算機索引程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞...
Lucene全文檢索
流程圖 一.建立文件 文件域 注 每乙個doucment可以有多個field,不同的document可以有不同的field,同乙個document可以有相同的field 網域名稱和域值都相同 每乙個文件都有唯一的編號 二.分析文件 將文件中的大寫轉化成小寫,清除 is a 標點 停用詞等過程生成語彙...
Lucene全文檢索初探
1 全文檢索是什麼 先建立索引,再對索引進行搜尋的過程。2 為什麼需要全文檢索 在網頁搜尋時,如果沒有全文檢索,每一次檢索資料都會對資料庫進行查詢,當資料庫的資料量非常大時,搜尋起來非常耗時以及耗費資源,所以我們可以先將資料庫的資料採集出來,提前對這些資料進行整理,建立索引,將這些索引檔案儲存到伺服...