我也是头一次接触,不对的地方多多指教。
创建一个索引,其中包括要索引的本地目录,和一个存放索引信息的路径
String indexDir = "E:\\帮助文档\\LUCENE\\index";//索引信息存放的目录String dataDir = "E:\\帮助文档\\LUCENE\\lucene-3.5.0";//要被索引的目录
注释3处分析一下,查看源码
org.apache.lucene.store.FSDirectory是一个抽象类,继承了抽象类org.apache.lucene.store.Directory,
而org.apache.lucene.store.Directory只实现了一个接口java.io.Closeable(java标准库),这个接口只有一个close方法
看一下FSDirectory的
public static FSDirectory open(File path) throws IOException {
return open(path, null);
}
这个方法调用
public static FSDirectory open(File path, LockFactory lockFactory) throws IOException {
if ((Constants.WINDOWS || Constants.SUN_OS || Constants.LINUX)
&& Constants.JRE_IS_64BIT && MMapDirectory.UNMAP_SUPPORTED) {
return new MMapDirectory(path, lockFactory);
} else if (Constants.WINDOWS) {
return new SimpleFSDirectory(path, lockFactory);
} else {
return new NIOFSDirectory(path, lockFactory);
}
}
这个方法根据系统信息返回不同的Directory,不过MMapDirectory、SimpleFSDirectory、NIOFSDirectory都继承了FSDirectory,所以也间接的继承了org.apache.lucene.store.Directory。
所以lucene的继承结构如下
MMapDirectory、SimpleFSDirectory、NIOFSDirectory继承FSDirectory继承org.apache.lucene.store.Directory。
其实我们经常用的就是FSDirectory类,根据系统环境不同,此类会帮我们自动选择适合系统坏境的处理类MMapDirectory、SimpleFSDirectory、NIOFSDirectory,不必关心这些细节
其实注释3处就是对绑定一个索引存放的路径,如果路径不存在,则会帮我们去创建这个目录,用来存放一些索引的信息
注释4处是生成一个lucene的写入类,用于写入索引信息。
org.apache.lucene.index.IndexWriter类的一些方法,先写点代码
File[] files = new File(dataDir).listFiles();
for (File f : files) {
if (!f.isDirectory() && !f.isHidden() && f.exists() && f.canRead()) {
//System.out.println("文件:"+f);
indexFile(f);
}
}
System.out.println(writer.numDocs());
private void indexFile(File f) throws Exception {
System.out.println("Indexing " + f.getCanonicalPath());
Document doc = getDocument(f);
writer.addDocument(doc);
}
protected Document getDocument(File f) throws Exception {
//3333333333333333333333333333333333333
//333333333333333333333333333333333
return doc;
}
介绍IndexWriter之前,先看看这个类 org.apache.lucene.document.Document。
这个类主要是构造索引文件,然后交由IndexWriter的addDocument(doc)方法来使用此索引文件
打开源码看一眼,此类只有一个无参构造方法
/** Constructs a new document with no fields. */
public Document() {},构造器没有任何动作。
看下他的重要方法
public final void add(Fieldable field);
此方法接收一个fieldalble参数,通过源码查看时一个接口
public interface Fieldable extends Serializable ,
它的实现类为org.apache.lucene.document.Field,
此实现类有很多构造方法,几乎能满足用户创建Field的各种需求,从字面意思看是创建搜索用的域,
更多的Field方法和属性就先不看了,先往下看
注释33333333之间是为每一个文件都创建文件索引信息(可以创建不同形式的索引方式,此处为三种,区别还不太清楚呢,等做搜索的时候在看把),以便于搜索
IndexWriter的addDocument(doc)方法,把每个文件的索引信息都写到了磁盘上作为缓存用。如果不清缓存则索引信息一直存在。
IndexWriter的numDocs()方法,返回索引文件中的文档数量。
到这里,简单的索引创建已经完成了