全文檢索 Apache Lucene初探

2021-07-10 06:40:50 字數 4326 閱讀 4695

我們簡單的講解一下什麼是

全文檢索

。因此,很容易的我們想到,應該建立乙個關鍵字與檔案的相關對映,下圖很明白的解釋了這種對映如何實現。

在lucene中,就是使用這種「倒排索引」的技術,來實現相關對映。 

下面是lucene的資料必出現的一張圖,但也是其精髓的概括。

我們可以看到,lucene的使用主要體現在兩個步驟:

1 建立索引,通過indexwriter對不同的檔案進行索引的建立,並將其儲存在索引相關檔案儲存的位置中。

2 通過索引查尋關鍵字相關文件。

下面針對官網上面給出的乙個例子,進行分析:

1   analyzer analyzer = new

standardanalyzer(version.lucene_current);23

//store the index in memory:

4 directory directory = new

ramdirectory();5//

to store an index on disk, use this instead:6//

directory directory = fsdirectory.open("/tmp/testindex");

7 indexwriterconfig config = new

indexwriterconfig(version.lucene_current, analyzer);

8 indexwriter iwriter = new

indexwriter(directory, config);

9 document doc = new

document();

10 string text = "this is the text to be indexed.";

11 doc.add(new field("fieldname", text, textfield.type_stored));

12iwriter.adddocument(doc);

13iwriter.close();

1415

//now search the index:

16 directoryreader ireader =directoryreader.open(directory);

17 indexsearcher isearcher = new

indexsearcher(ireader);

18//

parse a ****** query that searches for "text":

19 queryparser parser = new queryparser(version.lucene_current, "fieldname", analyzer);

20 query query = parser.parse("text");

21 scoredoc hits = isearcher.search(query, null, 1000).scoredocs;

22 assertequals(1, hits.length);

23//

iterate through the results:

24for (int i = 0; i < hits.length; i++)

28ireader.close();

29 directory.close();

首先,我們需要定義乙個詞法分析器。

比如一句話,「我愛我們的中國!」,如何對他拆分,扣掉停頓詞「的」,提取關鍵字「我」「我們」「中國」等等。這就要借助的詞法分析器analyzer來實現。這裡面使用的是標準的詞法分析器,如果專門針對漢語,還可以搭配paoding,進行使用。

1 analyzer analyzer = new standardanalyzer(version.lucene_current);
引數中的version.lucene_current,代表使用當前的lucene版本,本文環境中也可以寫成version.lucene_40。

第二步,確定索引檔案儲存的位置,lucene提供給我們兩種方式:

1 本地檔案儲存 

directory directory = fsdirectory.open("/tmp/testindex");
2 記憶體儲存

directory directory = new ramdirectory();
可以根據自己的需要進行設定。

第三步,建立indexwriter,進行索引檔案的寫入。

indexwriterconfig config = new

indexwriterconfig(version.lucene_current, analyzer);

indexwriter iwriter = new indexwriter(directory, config);

這裡的indexwriterconfig,據官方文件介紹,是對indexwriter的配置,其中包含了兩個引數,第乙個是目前的版本,第二個是詞法分析器analyzer。

第四步,內容提取,進行索引的儲存。

document doc = new

document();

string text = "this is the text to be indexed.";

doc.add(

new field("fieldname", text, textfield.type_stored));

iwriter.adddocument(doc);

iwriter.close();

第一行,申請了乙個document物件,這個類似於資料庫中的表中的一行。

第二行,是我們即將索引的字串。

第三行,把字串儲存起來(因為設定了textfield.type_stored,如果不想儲存,可以使用其他引數,詳情參考官方文件),並儲存「字段」為"fieldname".

第四行,把doc物件加入到索引建立中。

第五行,關閉indexwriter,提交建立內容。

這就是索引建立的過程。

第一步,開啟儲存位置

directoryreader ireader = directoryreader.open(directory);
第二步,建立搜尋器

indexsearcher isearcher = new indexsearcher(ireader);
第三步,類似sql,進行關鍵字查詢

queryparser parser = new queryparser(version.lucene_current, "fieldname", analyzer);

query query = parser.parse("text");

scoredoc hits = isearcher.search(query, null, 1000).scoredocs;

assertequals(1, hits.length);

for (int i = 0; i < hits.length; i++)

這裡,我們建立了乙個查詢器,並設定其詞法分析器,以及查詢的「字段「為」fieldname「。查詢結果會返回乙個集合,類似sql的resultset,我們可以提取其中儲存的內容。

關於各種不同的查詢方式,可以參考官方手冊。

第四步,關閉查詢器等。

這是其中最常用的五個檔案:

第乙個,也是最重要的,lucene-core-4.0.0.jar

,其中包括了常用的文件,索引,搜尋,儲存等相關核心**。

第二個,lucene-analyzers-common-4.0.0.jar,這裡面包含了各種語言的詞法分析器,用於對檔案內容進行關鍵字切分,提取。

第三個,lucene-highlighter-4.0.0.jar

,這個jar包主要用於搜尋出的內容高亮顯示。

第四個和第五個,lucene-queryparser-4.0.0.jar

,提供了搜尋相關的**,用於各種搜尋,比如模糊搜尋,範圍搜尋

什麼叫全文檢索 全文檢索概念

全文檢索是指計算機索引程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞在文章中出現的次數和位置,當使用者查詢時,檢索程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者的檢索方式。這個過程類似於通過字典中的檢索字表查字的過程。全文檢索的方法主要分為按字檢索和按詞檢索兩種。按字檢...

什麼叫全文檢索 全文檢索概念

全文檢索是指計算機索引程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞在文章中出現的次數和位置,當使用者查詢時,檢索程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者的檢索方式。這個過程類似於通過字典中的檢索字表查字的過程。全文檢索的方法主要分為按字檢索和按詞檢索兩種。按字檢...

MSSQL全文檢索

大家可能都會用 select from tb where field like 關鍵字 但是一旦資料量大使用者多,就會造成查詢過慢,因此ms提供一種犧牲空間來換取時間的解決方案。全文檢索。原文請看 我對自己的實現加了些注釋 use popask 使用這個庫 exec sp fulltext data...