org.apache.lucene.demo.IndexFiles 类中,使用递归的方式去索引文件 。在构造了一个IndexWriter索引器之后 ,就可以向索引器中添加Doucument 了,执行真正地建立索引的过程。遍历每个目录,因为每个目录中可能还存在目录,进行深度遍历,采用递归技术找到处于叶节点处的文件(普通的具有扩展名的文件,比如my.txt文件),然后调用如下代码中:
上面这一句:
writer.addDocument(FileDocument.Document(file));
其实做了很多工作。每当递归到叶子节点,获得一个文件,而非目录文件,比如文件myWorld.txt。然后对这个文件进行了复杂的操作 :
先根据由myWorld.txt构造的File对象f,通过f获取myWorld.txt的具体信息,比如存储路径、修改时间等等,构造多个Field对象,再由这些不同Field的聚合,构建出一个Document对象 ,最后把Document对象加入索引器IndexWriter对象中 ,通过索引器可以对 这些聚合的Document 的Field中信息进行分词、过滤处理 ,方便检索。
通过上面的代码,可以看出Field是何其的重要,必须把Field完全掌握了。
Field类定义了两个很有用enum:Store和Index,用它们来设置对Field进行索引时的一些属性。
Field类中还有一个内部类,它的声明如下:
这是一个与词条有关的枚举类型。
在3.0之前的lucene中,通常store index termvector都是被设置为静态内部类。。3.0开始设置为枚举类型。。。。。。
同时,Field的值可以构造成很多类型,Field类中定义了4种:String、Reader、byte[]、TokenStream。
然后就是Field对象的构造,应该看它的构造方法,它有9种构造方法:
还要注意了,通过Field类的声明:
public final class Field extends AbstractField implements Fieldable , Serializable
可以看出,应该对它继承的父类AbstractField类 有一个了解,下面的是AbstractField类的属性:
还有Field实现了Fieldable接口 ,添加了 一些对对应的Document中的Field进行管理判断的方法信息。