lucene入门系列(三、建立搜索)

本文介绍了一个使用Lucene进行索引搜索的方法,并将其与传统的字符串搜索进行了对比。通过具体实例展示了如何构建查询、执行搜索以及衡量两种方法的效率。
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");

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值