lucene(二)索引的建立 Directory,lockFactory

来源:互联网 发布:mac 使命召唤 编辑:程序博客网 时间:2024/05/29 19:42
生成索引的过程:
Analyzer analyzer = new StandardAnalyzer();//分词器,决定内容的分词方式
Directory directory = FSDirectory.open(Paths.get("D:\\index"));//创建存储目录Directory
IndexWriterConfig config = new IndexWriterConfig(analyzer);//写索引的配置
IndexWriter iwriter = new IndexWriter(directory, config);//写索引类
Document doc = new Document();//类似于数据库一条数据,一个Document对象
String text = "This is the text to be indexed.";
doc.add(new Field("fieldname", text, TextField.TYPE_STORED));
//Field类似于数据库一个字段,往Document上添加
iwriter.addDocument(doc);//添加索引(其实是update)
iwriter.close();//释放资源

Directory directory =FSDirectory.open(Paths.get("D:\\index")) 

Directory是org.apache.lucene.store包下的类
  public static FSDirectory open(Path path) throws IOException {
    //第二个参数使用了默认文件锁工厂 NativeFSLockFactory,是一个单例工厂
有一个方法makeFSLock根据文件目录,文件名获得文件的唯一锁NatvieFSLock
    return open(path, FSLockFactory.getDefault());
  }
 
  public static FSDirectory open(Path path, LockFactory lockFactory) throws IOException {
    if (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);
    }
  } 

NativeFSLock(NativeFSLockFactory的内部类)
    持有一个线程安全的Set保存所有锁的集合 private static final Set<String> LOCK_HELD 
                                        Collections.synchronizedSet(new HashSet<String>()); 
         有一个线程安全的obtain方法获取锁,close方法释放锁.

BaseDirectory的种类 MMapDirectory, SimpleFSDirectory, NIOFSDirectory,RAMDirectory
MMapDirectory
把Lucence的索引当作了swap file来处理,用到了虚拟内存的映射关系读取 64位且支持虚拟内存的系统,默认用的这个详细介绍 http://www.cnblogs.com/huangfox/p/3616298.html(推荐使用)  

SimpleFSDirectory
BaseDirectory的简单实现 poor concurrent performance (不支持MMapDirectory的Windows系统使用)

NIOFSDirector
用FileChannel进行读写操作,支持多线程,不适用Windows(Sun的FileChannel.read有bug),IO线程阻塞时,
从一个线程直接或间接的访问这个类被中断时,会立刻关闭底层文件描述符,
继续访问会抛出ClosedChaanelException

RAMDirectory 内存存储
    











0 0
原创粉丝点击