關於Lucene以及索引和搜尋的流程

2021-07-11 00:09:15 字數 3692 閱讀 4800

lucene的普及和成功的背後是因為它的簡單。

因此,你不需要深入理解lucene的資訊索引和檢索工作方面的知識就可以開始使用。

lucene提供了簡單但是強大的核心api去實現全文索引和檢索,你只需要掌握少數的類就能將lucene整合到應用中。

剛接觸lucene的人可能會誤認為lucene是乙個檔案搜尋工具、網路爬蟲、或者網頁搜尋引擎。實際上lucene是乙個軟體庫,而不是乙個全功能的搜尋應用程式。它涉及全文索引和搜尋,而且做得非常好。lucene可以讓你的應用程式隱藏起複雜的索引和搜尋背後的操作,而使用簡單的api處理特定的問題領域和業務規則。你可以想象lucene就是像乙個層,你的應用就在層的上面。

lucene允許你新增索引和搜尋功能到應用程式中。lucene不關心資料的**,lucene可以索引和搜尋任何可以轉換成文字格式的資料。這意味著你可以用lucene索引和搜尋資料:遠端web伺服器上的網頁、儲存在本地檔案系統的文件、簡單的文字檔案、microsoft word文件、html或pdf檔案,或者其他任何可以從中提取文字資訊的格式檔案。

所有搜尋引擎的核心就是索引的概念:把原始資料處理成乙個高效的交叉引用查詢,以便快速檢索。讓我們看看快速高效的索引和搜尋過程。

1.索引是什麼,為什麼它這麼重要?

假如你需要搜尋大量的檔案,你希望找到那些包含某個單詞或片語的檔案。你將如何去寫乙個程式實現這個功能?乙個做法就是按順序掃瞄每乙個檔案,搜尋是否包含給定的單詞或片語。但是這樣的做法有很多缺陷的,其中最明顯的就是在大量的檔案存在的情況下,速度是令人無法接受的。這種情況下,索引產生了。為了搜尋大量的文字,你首先要對這些文字以特定的結構儲存,這種儲存結構可以讓你迅速的搜尋,消除慢的順序掃瞄的過程。這種儲存結構就叫索引,將文字轉換成特定結構儲存的過程,就叫建立索引。

索引作為一種資料結構,允許你快速隨機的訪問儲存在裡面的詞。類似於字典的目錄,某個詞對應到某一頁,查詢的時候直接定位到那一頁,速度就非常快,不用一頁一頁的翻去查詢。lucene的索引是一種專門設計的資料結構,通常作為一組索引檔案儲存在檔案系統上。

2.什麼是搜尋?

3.lucene in action

假如我們需要索引和搜尋儲存在乙個目錄下的檔案。

在我們使用lucene進行搜尋之前,我們需要先建立索引。使用的lucene的版本是3.6。

3.1建立索引

1)建立存放索引的目錄directory

2)建立索引器配置管理類indexwriterconfig

3)使用索引目錄和配置管理類建立索引器

4)使用索引器將document寫到索引檔案中

索引器類:

/**

* 索引器

*@author luxh

*/public

class

indexer

//提交索引到磁碟上的索引庫,關閉索引器

indexwriter.close();

}/**

* 獲取檔名

*/public

static string getfilename(file file)

return filename;

}/**

* 獲取文字

*@param file

*/public

static string getfilecontent(file file)

content = sb.tostring();

}catch(exception e) finally catch (ioexception e)

}return content;

}}

indexwriter:索引器,負責建立和維護一條索引。

在lucene3.6版本,只推薦使用乙個構造方法indexwriter(directory d,indexwriterconfig conf),其他的構造方法都已經過時。所有關於indexwriter的配置都是通過indexwriterconfig來進行管理。

indexwriterconfig:索引器配置類,管理所有有關索引器的配置。只有乙個構造方法indexwriterconfig(version matchversion,analyzer analyzer),構造方法中的引數matchversion是lucene的版本,analyzer是分詞器。

接下來我們執行索引器建立索引。

public

class

testindexer

}

這樣我們就對當前路徑下filedir中的檔案建立了索引。

3.2執行搜尋

在lucene中搜尋像建立索引一樣簡單、快速。現在,我們建立乙個搜尋器,搜尋包含特定文字的檔案。

2)使用fsdirectory開啟索引所在的目錄。

3)使用indexreader讀取索引目錄和使用indexsearcher進行搜尋。

4)返回搜尋結果物件topdocs。topdocs包含搜尋到結果總數和結果的集合scoredocs陣列

5)遍歷結果的集合scoredocs陣列,根據每乙個scoredoc的文件編號獲取document

看看搜尋器的**:

/**

* 搜尋器

*@author luxh

*/public

class

searcher ;

//建立乙個分詞器,和建立索引時用的分詞器要一致

analyzer analyzer = new standardanalyzer(version.lucene_36);

//建立查詢解析器

queryparser queryparser = new multifieldqueryparser(version.lucene_36,fields,analyzer);

query query = queryparser.parse(keyword);

//開啟索引目錄

file indexdir = new file(indexdirpath);

directory directory = fsdirectory.open(indexdir);

//獲取訪問索引的介面,進行搜尋

indexreader indexreader = indexreader.open(directory);

indexsearcher indexsearcher = new indexsearcher(indexreader);

//topdocs 搜尋返回的結果

topdocs topdocs = indexsearcher.search(query, 100);//只返回前100條記錄

int totalcount = topdocs.totalhits; // 搜尋結果總數量

system.out.println("搜尋到的結果總數量為:" + totalcount);

scoredoc scoredocs = topdocs.scoredocs; // 搜尋的結果集合

listdocs = new arraylist();

for(scoredoc scoredoc : scoredocs)

indexreader.close();

indexsearcher.close();

return docs;

}}

接下來我們執行搜尋器:

public

class

testsearcher

}}

lucene搜尋索引

官方demo,裡面思路也算清晰,也可以執行 lucene 6.3.0建立索引 public class searchfiles string index index string field contents string queries null int repeat 0 boolean raw ...

搜尋引擎 lucene

lucene簡介 搜尋引擎的幾個概念 倒排 倒排索引 inverted index 也稱為反向索引,是搜尋引擎中最常見的資料結構,幾乎所有的搜尋引擎都會使用到倒排索引,它將文件中的詞作為關鍵字,建立詞與文件的對映關係,通過對倒排索引的檢索,可以根據詞快速獲取包含這個詞的文件列表,這對於搜尋引擎來說至...

lucene 對多個索引的搜尋和多執行緒搜尋

1 如果應用程式架構由多個lucene索引組成,則可以通過mutltisearcher把所有索引搜尋。也可以通過parallelmultisearcher進行多執行緒搜尋。在單核的情況下,multisearcher比parallelmultisearcher效能更高。2 multisearcher ...