1、组成文件索引操作框架的JAVA类
1)DocumentHandler:定义getDocument(InputStream)方法,此方法由所有的文档解析器实现
2)DocumentHandlerException:遇到错误情况时,该类将检测所有从文档解析器抛出的异常
3)FileHanlder:定义getDocument(File)方法,该方法由ExtensionFleHandler类实现
4)FileHanlderException:检测从实现了FileHandler接口的具体类中抛出的异常
5)ExtensionFileHandler:实现FileHandler接口的类与实现Document接口的类具有相同的工作方式,它传经根据由方法getDocument(File)传递给该实现类的文件扩展名来调用相应的分析器对不同的文档进行处理
2、
FileHandler接口
public interface FileHandler{
DocumentgetDocument(File file){
throws FileHandlerException;
}
}
3、
ExtensionFileHandler类实现了FileHandler接口。
public class ExtensionFileHandler implements FileHandler{
privateProperties handlerProps;
publicExtensionFileHandler(Proprops) throws IOException{
handlerProps=props;//映射文件扩展名
}
publicDocument getDocument(File file) throws FileHandlerException{
Document doc=null;
String name=file.getName();
int dotIndex=name.indexOf(".");
if((dotIndex>0)&&(dotIndex String ext=name.substring(dotIndex+1,name.length()); StringhandlerClassName=handlerProps.getProperty(ext);//将文件传递给解析器实现 try{//查找解析器名称 Class handler handler=(DocumentHandler)handlerClass.newIntance(); return handler.getDocument(new FileInputStream(file));// } catch (ClassNotFoundExceptoin e){ thrownew FileHandlerException ("cannotcreate instanceof:"+handlerClassName,e); } catch (InstantiationExceptoin e){ thrownew FileHandlerException ("cannotcreate instanceof:"+handlerClassName,e); } catch (IllegalAccessExceptoin e){ thrownew FileHandlerException ("cannotcreate instanceof:"+handlerClassName,e); } catch (FileNotFoundExceptoin e){ thrownew FileHandlerException ("Filenotfound:"+file.getAsbsolutePath(),e); } catch (DocumentHandlerExceptoin e){ thrownew FileHandlerException ("Documentcannot behandler:"+file.getAsbsolutePath(),e); } } return null; } public static void main(String[] args) throws Exception{ if (args.length<2) { usage(); System.exit(0); } Properties props=new Properties(); props.load(newFileInputStream(args[0]));//装载属性文件 ExtensionFileHandler fileHandler=newExtensionFileHandler(props); Documentdoc=fileHandler.getDocument(new File(args[1])); } privatestatic void usage(){ System.err.println("USAGE:java"+ExtensionFileHandler.class.getName() +"/path/to/properties /path/to/document"); } } } 4、FileIndex把搜索组件连接在一起,递归地遍历文件系统目录并同时索引其中的所有文件。 public class FileIndexer{ protected FileHandler fileHandler; publicFileIndexer(Properties props) throws IOException{ fileHandler=newExtensionFileHandler(props);//使用ExtensionFileHandler接口 } public void index(IndexWriter writer,File file) throwsFileHandlerException{ //index方法 if (file.canRead()){ //递归遍历可读的目录 if (file.isDirectory()){ String[] files=file.list(); if (files!=null){ for (int i=0;i index(writer,newFile(file,files[i])); } } } else{ System.out.println("Indexing"+file);//将文件传递给ExtensionFileHandler try{ Docuement doc=fileHandler.getDocument(file); if (doc!=null){ writer.addDocument(doc);//将返回的lucene文档增加到索引中 } else{ System.err.println("cannothandler"+file.getAbsolutedPath() +" ;skipping("+e.getMessage()+")"); } } } } publicstatic void main(String[] args) throws Exception{ if (args.length<3){ usage(); System.exit(0); } Properties props=new Properties(); props.load(new FileInputStream(args[0]));//读取命令行指定的属性文件 Directory dir=FSDirectory.getDirectory(args[2],true); Analyzeranalyzer=new SimpleAnalyzer(); IndexWriter writer=new IndexWriter(dir,analyzer,true);//打开索引 FileIndexer indexer=new FleIndexer(props);//创建FileIndexer实例 long start=new Date().getTime(); indexer.index(writer,new File(args[1]));//首次调用index方法 writer.optimize();//优化索引:关闭索引写入器 writer.close(); long end=new Date().getTime(); System.out.println(); IndexReaderreader=IndexReader.open(dir); //面向用户的摘要信息 System.out.println("Document indexed:"+reader.numDocs()); System.out.println("Totaltime:"+(end-start)+"ms"); reader.close(); } privatestatic void usage(){ System.err.println("USAGE:java"+ExtensionFileHandler.class.getName() +"/path/to/properties /path/to/document"); } } }