Lucene全文檢索初探

2021-08-09 18:21:53 字數 3490 閱讀 8365

(1)全文檢索是什麼:先建立索引,再對索引進行搜尋的過程。

(2)為什麼需要全文檢索:在網頁搜尋時,如果沒有全文檢索,每一次檢索資料都會對資料庫進行查詢,當資料庫的資料量非常大時,搜尋起來非常耗時以及耗費資源,所以我們可以先將資料庫的資料採集出來,提前對這些資料進行整理,建立索引,將這些索引檔案儲存到伺服器的硬碟上,當使用者進行資料搜尋時,直接從我們建立好的索引庫查詢結果,不僅避免了多次查詢資料庫的效能問題,而且還能加快搜尋速度。

(3)為什麼全文檢索的速度快:傳統方法是先找到檔案,再找內容,如何在檔案中找內容,在檔案內容中匹配搜尋關鍵字,這種方法是順序掃瞄方法,資料量大時搜尋非常慢。而全文檢索使用的是倒排索引結構,是根據內容(分好的詞)找文件,倒排索引結構也叫反向索引結構,包括索引和文件兩部分,索引即詞彙表,它是在索引中匹配搜尋關鍵字,由於索引內容量有限並且採用固定優化演算法搜尋速度很快,找到了索引中的詞彙,詞彙與文件關聯,從而最終找到了文件。

(4)分詞的作用:分詞就是將採集到的文件內容切分成乙個乙個的詞,具體應該說是將document中field的value值切分成乙個乙個的詞。切分好後按照 field的name:切分的詞 這種結構建立好索引,搜尋時根據field的name確定範圍,再根據分詞查詢到相應的建立好的索引,分詞目的為了建立索引。

(5)為什麼要建立索引:索引的目的為了加快搜尋,之所以能加快搜尋那是因為索引使用的是倒排索引結構。

是否分詞(tokenized):

分詞目的為了建立索引,id、身份證號、訂單號這些不需要分詞,因為他是乙個整體,所以將整個作為乙個串儲存在索引中,通常使用field類的stringfield方法進行構建,而商品名稱以及商品詳情這些需要進行分詞,因為搜尋時會按照這些關鍵字來搜尋,搜尋的前提是已經建立好索引,而分詞就是為了建立索引,通常使用textfield方法進行構建。

是否索引(indexed):

索引的目的為了搜尋,根據搜尋時會按照哪些關鍵字來搜尋從而確定該欄位是否需要索引,例如商品名稱以及商品詳情都需要索引。

field類的幾個方法:

(1)stringfield(fieldname, fieldvalue,store.yes/store.no)):不分詞、索引、儲存或不儲存。將整個串儲存在索引中,比如(訂單號,身份證號等)

(2)longfield(fieldname, fieldvalue,store.yes/store.no) | floatfield(fieldname, fieldvalue,store.yes/store.no):

分詞、索引、儲存或不儲存。用來構建乙個long/float的數字型field,進行分詞和索引,比如(**),是否儲存在文件中用store.yes或store.no決定

(4)textfield(fieldname, fieldvalue, store.yes/store.no) | textfield(fieldname, reader):

分詞、索引、儲存或不儲存。用來構建內容比較多的field,比如(商品描述),lucene預設採用不儲存的策略

2、全文檢索**

public

class

lucenefirst

//3.分析文件(分門別類的存放) 分析器(分詞器)

analyzer analyzer = new standardanalyzer();//標準分詞器

//4.建立索引

指定索引庫的位置 有兩種方式(fs: 儲存在磁碟 ram:儲存在記憶體中),一般使用儲存在磁碟中

fsdirectory directory = fsdirectory.open(new file("f:\\index"));

配置並且建立流writer物件 indexwriter,用於寫出索引

indexwriterconfig config = new indexwriterconfig(version.lucene_4_10_3, analyzer);

indexwriter writer = new indexwriter(directory, config );

將文件物件新增到索引庫中(寫出索引)

writer.adddocuments(documents);

//關流

writer.close();

}@test

//搜尋的流程

public

void

searchindex() throws ioexception

}@test

// 刪除索引

public

void

deleteindex() throws exception

@test

// 更新索引

public

void

updateindex() throws exception

}

3、ikanalyzer中文分詞器的使用(切記:建立索引和搜素要使用同乙個分詞器)

(1)匯入ikanalyzer的jar包並buildpath

(2)在專案下(不是src下面)建立config資料夾,資料夾型別為source folder

(3)將 mydict.dic、ikanalyzer.cfg.xml、ext_stopword.dic 這3個檔案拷貝到config資料夾

<1>mydict.dic:擴充套件詞典檔案,在該檔案裡面新增自定義的分詞片語後分詞時就會按照我們自定義的方式來分詞

例如:向mydict.dic檔案新增 「我是誰」 這個片語後在對 「我是誰」 進行分詞時會增加(原有基礎上)乙個 「我是誰」 這個分詞結果,而使用標準分詞器沒有自定義分詞時分詞結果為 「我」 「是」 「誰」 ,不會生成 「我是誰」 這個片語

<2>ext_stopword.dic:停用詞詞典檔案,在該檔案裡面新增自定義的停用詞片語後在分詞時自動遮蔽該停用詞

例如:向ext_stopword.dic新增 「我是誰」 這個片語後在對 「我是誰」 進行分詞時會遮蔽 「我是誰」 這個片語,也就是說分詞結果只有 「我」 「是」 「誰」 這三個結果,即使mydict.dic檔案中有 「我是誰」 這個自定義詞組也不行

注意:修改這兩個檔案時不要使用windows自帶的記事本來修改,因為修改後需要儲存為utf-8編碼的文件,而用記事本儲存後編碼為有bom的utf-8,推薦使用eclipse自帶的編輯器或者notepad++編輯

(4)編輯ikanalyzer.cfg.xml檔案,內容根據實際情況修改

ik analyzer 擴充套件配置comment>

key="ext_dict">mydict.dic;entry>

key="ext_stopwords">ext_stopword.dic;entry>

properties>

(5)測試分詞的效果(實際情況是直接對採集到的資料進行分詞,這裡只是測試,了解即可)

public

void

testanalyzer() throws ioexception

//關閉流

tokenstream.close();

}

lucene 全文檢索

在講全文檢索之前,先說下資訊檢索。資訊檢索通俗的講,就是從資訊集合中找出與使用者相關的資訊,除了文字之外,還有音訊 影象等。全文檢索 把使用者的查詢請求和全文中的每個詞進行比較,不考慮查詢請求與文字語義上的匹配。b 全文檢索是指計算機索引程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞...

Lucene全文檢索

流程圖 一.建立文件 文件域 注 每乙個doucment可以有多個field,不同的document可以有不同的field,同乙個document可以有相同的field 網域名稱和域值都相同 每乙個文件都有唯一的編號 二.分析文件 將文件中的大寫轉化成小寫,清除 is a 標點 停用詞等過程生成語彙...

Lucene 全文檢索案例

順序掃瞄法 全盤掃瞄,效率低 全文檢索法 先建立索引再進行搜尋 1 建立乙個directory物件,指定索引庫儲存的位置 2 基於directory物件建立乙個indexwriter物件 3 讀取磁碟上的檔案,對應每個檔案建立乙個文件物件 4 向文件物件中新增域 5 把文件物件寫入索引庫 6 關閉i...