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 ...