Lucene全文檢索系列(一)

2022-07-20 18:03:10 字數 4042 閱讀 6817

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 為什麼需要全文檢索 在網頁搜尋時,如果沒有全文檢索,每一次檢索資料都會對資料庫進行查詢,當資料庫的資料量非常大時,搜尋起來非常耗時以及耗費資源,所以我們可以先將資料庫的資料採集出來,提前對這些資料進行整理,建立索引,將這些索引檔案儲存到伺服...