package com.heming.lucene.process;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
/**
* 搜索
*
* @author 何明
*
*/
public class Search {
private String INDEX_STORE_PATH = "d:\\index";
/**
* 利用Lucene的搜索
*
* @param searchType
* 代表重要搜索的Filed
* @param searchKey
* 代表关键字
*/
public void indexSearch(String searchType, String searchKey) {
try {
// 根据索引位置建立 IndexSearcher
IndexSearcher searcher = new IndexSearcher(INDEX_STORE_PATH);
// 建立搜索单元,searchType代表重要搜索的Filed,searchKey代表关键字
Term t = new Term(searchType, searchKey);
// 由Term生成一个Query
Query q = new TermQuery(t);
// 搜索开始时间
Date beginTime = new Date();
// 获取一个<document,frequency>的枚举对象TermDocs
TermDocs termDocs = searcher.getIndexReader().termDocs(t);
while (termDocs.next()) {
// 输出文件中出现关键词的次数
System.out.println(termDocs.freq());
// 输出搜索到关键词的文档
// System.out.println(searcher.getIndexReader().document(termDocs.doc()));
}
// 搜索完成时间
Date endTime = new Date();
// 搜索所耗时间
long timeOfSearch = endTime.getTime() - beginTime.getTime();
System.out.println("The time For indexsearch is " + timeOfSearch
+ "ms");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 利用String的搜索
*
* @param keyWord
* 关键词
* @param searchDir
* 搜索目录
*/
public void StringSearch(String keyWord, String searchDir) {
File filesDir = new File(searchDir);
// 返回目录文件夹所有文件数组
File[] files = filesDir.listFiles();
// HashMap保存文件名和匹配次数对
Map rs = new HashMap();
// 记录搜索开始时间
Date beginTime = new Date();
// 遍历所有文件
for (int i = 0; i < files.length; ++i) {
// 初始化匹次数
int hits = 0;
try {
// 读取文件内容
BufferedReader br = new BufferedReader(new FileReader(files[i]));
StringBuffer sb = new StringBuffer();
String line = br.readLine();
while (null != line) {
sb.append(line);
line = br.readLine();
}
br.close();
// 将StringBuffer转化成String,便于搜索
String stringToSearch = sb.toString();
// 初始化fromIndex
int fromIndex = -keyWord.length();
// 逐个匹配关键词
while (-1 != (fromIndex = stringToSearch.indexOf(keyWord,
fromIndex + keyWord.length()))) {
++hits;
}
// 将文件名和匹配次数加入HashMap中
rs.put(files[i].getName(), new Integer(hits));
} catch (Exception e) {
e.printStackTrace();
}
// 输出查询结果
Iterator it = rs.keySet().iterator();
while (it.hasNext()) {
String fileName = (String) it.next();
Integer hit = (Integer) rs.get(fileName);
// System.out.println("find" + hit.intValue() + "matches in "
// + fileName);
// ;
}
// 记录结束时间
Date endTime = new Date();
// 得到搜索耗费时间
long timeOfSearch = endTime.getTime() - beginTime.getTime();
System.out.println("The time For string search is " + timeOfSearch
+ "ms");
}
}
public static void main(String[] args) {
Search search = new Search();
// 通过索引搜索关键词
search.indexSearch("content", "String");
// 通过String的API搜索关键词
search.StringSearch("line", "d:\\test");
}
}
lucene入门系列(三、建立搜索)
最新推荐文章于 2025-09-02 11:29:26 发布
