Lucene:递归遍历目录,对目录中的每个文本文件创建索引
递归遍历每个目录(每个目录中可能还存在目录),进行深度遍历,找到处于叶节点处的文本文件(即扩展名为.txt的文件)并创建索引。
1 static void indexDocs(IndexWriter writer, File file) 2 throws IOException { 3 // file可以读取 4 if (file.canRead()) { 5 // 如果file是一个目录(该目录下面可能有文件、目录文件、空文件三种情况) 6 if (file.isDirectory()) { 7 // 获取file目录下的所有文件(包括目录文件)File对象,放到数组files里 8 String[] files = file.list(); 9 if (files != null) {// 如果files!=null 10 // 对files数组里面的File对象递归索引,通过广度遍历 11 for (int i = 0; i < files.length; i++) { 12 indexDocs(writer, new File(file, files[i])); 13 } 14 } 15 }else { // 到达叶节点时,说明是一个File,而不是目录,则建立索引 16 System.out.println("adding " + file); 17 try { 18 writer.addDocument(FileDocument.Document(file)); 19 } catch (FileNotFoundException fnfe) { 20 ; 21 } 22 } 23 } 24 }
FileDocument类的定义
1 import java.io.File; 2 import java.io.FileReader; 3 4 import org.apache.lucene.document.DateTools; 5 import org.apache.lucene.document.Document; 6 import org.apache.lucene.document.Field; 7 8 9 public class FileDocument { 10 public static Document Document(File f) throws java.io.FileNotFoundException { 11 12 // 实例化一个Document 13 Document doc = new Document(); 14 // 根据传进来的File f,构造多个Field对象,然后把他们都添加到Document中 15 16 // 通过f的所在路径构造一个Field对象,并设定该Field对象的一些属性: 17 // “path”是构造的Field的名字,通过该名字可以找到该Field 18 // Field.Store.YES表示存储该Field;Field.Index.UN_TOKENIZED表示不对该Field进行分词,但是对其进行索引,以便检索 19 doc.add(new Field("path", f.getPath(), Field.Store.YES, Field.Index.UN_TOKENIZED)); 20 21 // 构造一个具有最近修改修改时间信息的Field 22 doc.add(new Field("modified", DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE), Field.Store.YES, Field.Index.UN_TOKENIZED)); 23 24 // 构造一个Field,这个Field可以从一个文件流中读取,必须保证由f所构造的文件流是打开的 25 doc.add(new Field("contents", new FileReader(f))); 26 return doc; 27 } 28 29 private FileDocument() {} 30 }