lucene 索引技術

2021-08-25 01:59:59 字數 3810 閱讀 6358

一、 lucene索引建立和優化 [版本2.9.0以上]

lucene索引的建立首先需要取得幾個必須的物件:

1、分詞器//可以採用其他的中文分詞器

standardanalyzer analyzer = new standardanalyzer(version.lucene_current);//分詞器

2、lucene目錄

file dir = new file(indexdir);// indexdir為檔案路徑

//這種目錄存在鎖機制,在開啟目錄時,寫的權利一次只分給乙個使用者;有效保證了索引檔案不會因為多執行緒問題,同時寫索引導致檔案損壞。

directory idxdir = new ******fsdirectory(dir, new ******fslockfactory());

3、寫索引物件

// isnewcreate為boolean值

indexwriter writer = new indexwriter(idxdir, analyzer, isnewcreate, indexwriter.maxfieldlength.limited);

對writer物件可以做一些基本設定,以便優化資料操作。

writer.setmergefactor(50); // 多少個合併一次【優化快取】

writer.setmaxmergedocs(5000); // 乙個segment最多有多少個document【優化索引儲存的segment檔案】

4、document例項化和引數設定

writer可以寫入的物件document也需要預先申明。

document doc = new document();

這個document是lucene自定義的一種儲存節點物件。乙個document可以包含n個filed域,n的取值可以在indexwriter定義的時候申明。各種域對應不同的應用場景。

//只儲存,不做索引分析,value值就是唯一索引對應該條記錄

field field = new field(key1, value1, store.yes, index.not_analyzed_no_norms);

//儲存,且做索引分析,value值被分析器解析成各種分詞,一組索引對應該條記錄

field = new field(key2, value2, store.yes, index.analyzed);

//只儲存,沒有索引對應該域

field = new field(key3, value3, store.yes, index.no);

// 數字範圍搜尋

numericfield numericfield = new numericfield(key4, store.yes, true);

numericfield.setlongvalue(value4);

域生成之後通過document的add方法新增到乙個document物件中。

//document 域的新增

doc.add(field);

doc.add(numericfield);

5、對索引的寫操作和優化操作關鍵步驟如下

writer.adddocument(doc);//向索引檔案中寫資料

writer.optimize();// 索引優化,一般執行此步驟時,所消耗的記憶體是寫入索引所需記憶體的2倍,在執行索引生成操作的時候本身就對記憶體有比較大的消耗,最好在索引建立完成之後,執行此步驟。

writer.commit();//資料提交

writer.rollback();//資料回滾

writer.close();//關閉流索引寫入器,此步驟才真正將資料寫入到索引檔案中。

二、 lucene索引實現 精確查詢 分詞查詢 範圍查詢 多條件查詢等

查詢的步驟實現:

1、首先需要設定查詢條件引數。

booleanquery query = new booleanquery();// 多條件查詢 處理檢索條件

query termquery = new termquery(new term(key,value)); // 基本/精確 查詢

query.add(termquery, occur.must);// 根據索引中的document生成時的設定,可以實現精確記錄

/* 範圍查詢 */

query numericrangequery = numericrangequery.newlongrange(key, minvaluelong, maxvaluelong, true, true);

query.add(numericrangequery, occur.must); // numericrangequery是按數值範圍匹配

/* 多域組合查詢 */

booleanclause.occur occurs =

new booleanclause.occur ;

query multifieldquery = multifieldqueryparser.parse(keyword, new string , occurs, analyzer);

query.add(multifieldquery, occur.must);// multifieldquery是把關鍵字keyword分別在key1和key2中匹配 組合查詢

2、建立索引搜尋器。

//以唯讀方式,建立索引搜尋器

indexsearcher searcher = new indexsearcher(idxdir, readonly);//readonly 為boolean值

3、設定排序條件。

//設定根據哪個域的key來排序

sortfield field = null;

// long型降序

field = new sortfield(key, sortfield.long, true);

// long型公升序

field = new sortfield(key, sortfield.long, false);

// 搜尋引擎權重

field = new sortfield(null, sortfield.score, true);//不需要指定域的key來排序,lucene中會根據查詢結果出現的次數給每個結果設定排序引數,搜尋結果會按照這個排序引數的大小來由大到小進行排序。【即為搜尋結果熱門程度的降序排列】

// integer型排序

field = new sortfield(key, sortfield.int, true);

// 單條件排序

sort sort = = new sort(field);

// 多條件排序

sortfield fields = new sortfield ;

sort sort = = new sort(fields);

4、執行查詢操作,並處理獲得查詢結果

//查詢獲取結果

// 查詢 searcher.maxdoc()為searcher中所包含的最大document下標值 filter為過濾器[沒有的話,一般寫null]

topfielddocs docs = searcher.search(query, filter, searcher.maxdoc(), sort);

scoredoc scoredocs = docs.scoredocs;//權值物件 包含document下標資訊,能確定searcher中的document的下標。

int doccount = scoredocs.length;//查詢結果統計

// 取出最後乙個查出的document物件

document doc = searcher.doc(scoredocs[doccount - 1].doc); // 通過document下標值,獲取document物件

lucene使用教程2 索引技術

我們需要對文件進行預處理,建立一種便於檢索的資料結構,以此來提高資訊檢索的速度,這種資料結構就是索引。目前廣泛使用的一種索引方式是倒排序索引。倒排序索引的原理就如同查字典。要先查目錄,得到資料對應的頁碼,在直接翻到指定的頁碼。不是在文章中找詞,而是從目錄中找詞所在的文章。這需要在索引庫中生成乙個詞彙...

lucene索引合併

lucene 索引合併 關鍵步驟如下 indexwriter fswriter null fs indexwriter ramwriter null ram directory fsdir directory ramdir ramdir new ramdirectory 判斷原索引檔案是否存在 開啟...

Lucene 建立索引

public class indexer public static string indexdir d luceneindex public static void main string args system.out.println 被索引的文件個數 writer.numdocs catch ...