lucene Creating an Index

我也是头一次接触,不对的地方多多指教。

创建一个索引,其中包括要索引的本地目录,和一个存放索引信息的路径

String indexDir = "E:\\帮助文档\\LUCENE\\index";//索引信息存放的目录

String dataDir = "E:\\帮助文档\\LUCENE\\lucene-3.5.0";//要被索引的目录

Directory dir = FSDirectory.open(new File(indexDir));//3

 IndexWriter  writer = new IndexWriter(dir, new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));//4

注释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

        Document doc = new Document();

        doc.add(new Field("contents", new FileReader(f)));

        doc.add(new Field("filename", f.getName(), Field.Store.YES,

                Field.Index.NOT_ANALYZED));

        doc.add(new Field("fullpath", f.getCanonicalPath(), Field.Store.YES,

                Field.Index.NOT_ANALYZED));

        //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()方法,返回索引文件中的文档数量。

到这里,简单的索引创建已经完成了

 

你可能感兴趣的:(lucene Creating an Index)