實現一個搜索類 Search,提供兩種搜索方式:
IndexSearcher、TermQuery 對已建立索引的文檔進行關鍵字查詢,輸出命中文檔名及頻次、耗時。String.indexOf 統計關鍵字出現次數,輸出結果與耗時。public class Search {
private String INDEX_STORE_PATH = "E:\\Lucene項目\\索引目錄";
// Lucene 索引搜索
public void indexSearch(String searchType, String searchKey) {
IndexSearcher searcher = new IndexSearcher(INDEX_STORE_PATH);
Term t = new Term(searchType, searchKey);
Query q = new TermQuery(t);
Date begin = new Date();
TermDocs termDocs = searcher.getIndexReader().termDocs(t);
while (termDocs.next()) {
System.out.println("find " + termDocs.freq() + " matches in " +
searcher.getIndexReader().document(termDocs.doc()).getField("fileName").stringValue());
}
Date end = new Date();
System.out.println("索引搜索耗時: " + (end.getTime() - begin.getTime()) + "ms");
}
// 字符串匹配搜索
public void stringSearch(String keyword, String searchDir) {
File dir = new File(searchDir);
File[] files = dir.listFiles();
Map rs = new LinkedHashMap<>();
Date begin = new Date();
for (File f : files) {
int hits = 0;
String content = readFile(f); // 讀取全文
int idx = -keyword.length();
while ((idx = content.indexOf(keyword, idx + keyword.length())) != -1) hits++;
rs.put(f.getName(), hits);
}
Date end = new Date();
// 輸出結果與耗時...
}
public static void main(String[] args) {
Search s = new Search();
s.indexSearch("content", "保爾");
s.stringSearch("保爾", "INDEX_STORE_PATH");
}
}
Term 是 Lucene 搜索的最小單元(如詞語)。TermDocs 提供文檔編號與詞頻的枚舉。需引入 Lucene 核心庫 (lucene-core.jar),JDK 1.8+。