今天下午按lucene in action调试了建立文本文件索引的例子,晚上又来调试一下基于索引的搜索例子过程(体会一下空间换取时间的感觉,呵呵),先回顾一下建立索引的过程:
1)利用IndexWriter对象及StandarAnalyzer关联输出的索引文件夹;
2)对IndexWriter对象进行相关设置,利用递归遍历被索引的文件夹所有文本文件并建立filed ,document为结构的索引。
3)IndexWriter对象调用close方法,正式将建立的索引文件存入磁盘索引文件夹中。
下面在索引的基础上来写搜索例子,照书抄了一下,呵呵。代码如下:
/*******************************************************************************
* 该类主要功能及特点:use lucene's Query Class and Indexsearcher Class to search keywords
* from index dictionary of text files
*
* @see(与该类相关的类:)
*
* 开发公司或单位:XX软件有限公司研发中心 版权:本软件版权归属XX公司研发中心
*
* @author (作者):张XX
* @since (该文件所支持的jdk版本):jdk1.5或以上
* @version (版本):1.0
*
* @date ():2009-2-22 最后更改日期:2009-2-22
*
* 修改人:张XX
*
* 复审人:张三,李四,王五
*
*/
// *************************************************************************************
package com.goodwitkey.searcher;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
public class Searcher {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
if (args.length != 2) {
throw new Exception("java: " + Searcher.class.getName()
+ "<indexdir indir>,<query>");
}
File indexdir = new File(args[0]);
String qr = args[1];
if ((!indexdir.exists()) || (!indexdir.isDirectory())) {
throw new Exception(indexdir.toString()
+ "is not exist or is not a directory");
}
search(indexdir, qr);
}
/**
* @param indexdir
* @param query
* @throws IOException
* @throws ParseException
*/
public static void search(File indexdir, String qr) throws IOException,
ParseException {
Directory fsDir = FSDirectory.getDirectory(indexdir, false);
IndexSearcher is = new IndexSearcher(fsDir);
Query query = QueryParser.parse(qr, "contents", new StandardAnalyzer());
long starttime = new Date().getTime();
Hits hits = is.search(query);
long endtime = new Date().getTime();
System.out.println("Search the key word has elapsed "
+ (endtime - starttime) + "ms");
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.println(doc.get("filename"));
}
}
}
这就没有遇到什么问题,比较顺利,运行结果如下:
Search the key word has elapsed 16ms
C:\data\赖昌星.txt
Document<Keyword<filename:C:\data\赖昌星.txt>>
总结一下流程:
1)用SearcherWriter对象来指向索引目录(用FSDirectory类完成);
2)用Query的具体对象来解析要搜索的关键字或词;
3) 执行搜索并将得到结果放到hits容器中。