现在的位置: 首页 > 综合 > 正文

Lucene:递归遍历目录,对目录中的每个文本文件创建索引

2012年12月16日 ⁄ 综合 ⁄ 共 1566字 ⁄ 字号 评论关闭

递归遍历每个目录(每个目录中可能还存在目录),进行深度遍历,找到处于叶节点处的文本文件(即扩展名为.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 }

 

 

 

抱歉!评论已关闭.