前言:根據(jù)Lucene7.0版本介紹Lucene相關(guān)知識(shí)
總體架構(gòu)
在Lucene in action中,Lucene 的構(gòu)架和過程如下圖肝集,
Lucene in action 中Lucene架構(gòu)
根據(jù)Lucene架構(gòu)圖瞪讼,lucene主要包含兩個(gè)過程钧椰,建立索引以及搜索索引。
- 建立索引
使用Lucene時(shí)符欠,將被搜索的內(nèi)容包括文件嫡霞、數(shù)據(jù)庫、web數(shù)據(jù)等數(shù)據(jù)源轉(zhuǎn)換成lucene的Document對(duì)象希柿,存入系統(tǒng)文件或內(nèi)存中诊沪,建立索引。 - 搜索索引
當(dāng)用戶搜索時(shí)曾撤,將用戶搜索內(nèi)容封裝成Query對(duì)象端姚,并通過search函數(shù)搜索Lucene索引,如果命中關(guān)鍵詞盾戴,則返回命中的TopDocs對(duì)象
具體代碼(Lucene7.0)
public void buildIndex() {
try {
//索引建立過程
//創(chuàng)建索引目錄寄锐,RAMDirectory基于內(nèi)存
RAMDirectory directory = new RAMDirectory();
//保存用于創(chuàng)建IndexWriter對(duì)象的所有配置;WhitespaceAnalyzer空白分詞器尖啡,用于建立索引時(shí)的分詞
IndexWriterConfig config = new IndexWriterConfig(new WhitespaceAnalyzer());
//創(chuàng)建IndexWriter用于建立索引
IndexWriter indexWriter = new IndexWriter(directory, config);
//Document索引的載體橄仆,每條索引信息對(duì)應(yīng)一個(gè)document對(duì)象
Document document = new Document();
//Field對(duì)象相當(dāng)于索引信息的某個(gè)屬性,通過add()添加到document中衅斩,StringField的value作為一個(gè)整體盆顾,不能再被分詞;第三個(gè)參數(shù)代表是否被存儲(chǔ)
document.add(new StringField("name", "seansherwood", Field.Store.YES));
//TextField中的值需要被分詞器分詞
document.add(new TextField("description", "like Android and Lucene", Field.Store.YES));
//建立索引
indexWriter.addDocument(document);
//建立索引之后要將indexWriter對(duì)象commit方法,對(duì)于索引的增刪改操作都需要進(jìn)行commit畏梆;如果建立索引完成可以直接調(diào)用close您宪,其默認(rèn)調(diào)用了commit
indexWriter.close();
//搜索過程
//IndexSearcher用于索引搜索,參數(shù)需要?jiǎng)?chuàng)建索引時(shí)的索引目錄
IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(directory));
//封裝搜索查詢語句
Query query = new TermQuery(new Term("description", "Lucene"));
//搜索返回命中的document的ID對(duì)象
TopDocs hit = searcher.search(query, 10);
System.out.println(hit.scoreDocs.length);
//遍歷拿到索引中的document
for (int i = 0; i < hit.scoreDocs.length; i++) {
Document doc = searcher.doc(hit.scoreDocs[i].doc);
System.out.println("name:" + doc.get("name"));
System.out.println("description:" + doc.get("description"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
注:能力一般奠涌,水平有限宪巨,如有不當(dāng)之處,請(qǐng)批評(píng)指正溜畅,定當(dāng)虛心接受捏卓!