搜索過(guò)程是由Lucene所提供的核心功能之一。下圖說(shuō)明了搜索過(guò)程和使用的類。 IndexSearcher是搜索過(guò)程中最重要的和核心組件。
我們首先創(chuàng)建目錄包含索引,然后將它傳遞給IndexSearcher,它使用IndexReader打開(kāi)目錄。然后,創(chuàng)建一個(gè)期限查詢,使搜索usingIndexSearcher通過(guò)將查詢到的搜索。 IndexSearcher返回TopDocs對(duì)象包含搜索信息連同它是搜索操作的結(jié)果的文檔的文檔ID(多個(gè))。
現(xiàn)在,我們將展示一個(gè)循序漸進(jìn)的過(guò)程,以獲得在索引過(guò)程的理解,使用一個(gè)基本的例子。
QueryParser類解析用戶輸入,并輸入到 Lucene 理解的格式的查詢。
創(chuàng)建QueryParser的對(duì)象。
初始化一個(gè)在此查詢運(yùn)行有標(biāo)準(zhǔn)的分析版本信息和索引的名字創(chuàng)建QueryParser對(duì)象。
QueryParser queryParser; public Searcher(String indexDirectoryPath) throws IOException{ queryParser = new QueryParser(Version.LUCENE_36, LuceneConstants.CONTENTS, new StandardAnalyzer(Version.LUCENE_36)); }
IndexSearcher類作為它在索引過(guò)程中創(chuàng)建搜索索引的核心組成部分。
創(chuàng)建IndexSearcher對(duì)象。
創(chuàng)建其應(yīng)指向位置,其中索引是存儲(chǔ)一個(gè) lucene 的目錄。
初始化索引目錄中創(chuàng)建 IndexSearcher 的對(duì)象
IndexSearcher indexSearcher; public Searcher(String indexDirectoryPath) throws IOException{ Directory indexDirectory = FSDirectory.open(new File(indexDirectoryPath)); indexSearcher = new IndexSearcher(indexDirectory); }
要開(kāi)始搜索,通過(guò) QueryParser 解析搜索表達(dá)式創(chuàng)建一個(gè)查詢對(duì)象。
通過(guò)調(diào)用IndexSearcher.search()方法搜索。
Query query; public TopDocs search( String searchQuery) throws IOException, ParseException{ query = queryParser.parse(searchQuery); return indexSearcher.search(query, LuceneConstants.MAX_SEARCH); }
public Document getDocument(ScoreDoc scoreDoc) throws CorruptIndexException, IOException{ return indexSearcher.doc(scoreDoc.doc); }
public void close() throws IOException{ indexSearcher.close(); }
讓我們創(chuàng)建一個(gè)測(cè)試Lucene的應(yīng)用程序來(lái)測(cè)試搜索過(guò)程。
步驟 | 描述 |
---|---|
1 | 創(chuàng)建下名稱為L(zhǎng)uceneFirstApplication的一個(gè)項(xiàng)目作為解釋Lucene的應(yīng)用在包packagecom.yiibai.lucene下,在第一個(gè)應(yīng)用程序的篇章。也可以使用Lucene創(chuàng)建的項(xiàng)目理解搜索過(guò)程。 |
2 | 創(chuàng)建LuceneConstants.java,TextFileFilter.java和Searcher.java 用于 Lucene解釋- 在第一應(yīng)用章節(jié)。其它文件保持不變。 |
3 | 創(chuàng)建LuceneTester.java如下所述。 |
4 | 清理和構(gòu)建應(yīng)用程序,以確保業(yè)務(wù)邏輯按要求工作。 |
LuceneConstants.java
這個(gè)類是用來(lái)提供可應(yīng)用于示例應(yīng)用程序中使用的各種常量。
package com.yiibai.lucene; public class LuceneConstants { public static final String CONTENTS="contents"; public static final String FILE_NAME="filename"; public static final String FILE_PATH="filepath"; public static final int MAX_SEARCH = 10; }
TextFileFilter.java
此類用于 .txt文件過(guò)濾器。
package com.yiibai.lucene; import java.io.File; import java.io.FileFilter; public class TextFileFilter implements FileFilter { @Override public boolean accept(File pathname) { return pathname.getName().toLowerCase().endsWith(".txt"); } }
Searcher.java
這個(gè)類用來(lái)讀取就使用Lucene庫(kù)的原始數(shù)據(jù),并搜索數(shù)據(jù)的索引。
package com.yiibai.lucene; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer;