用户名: 密 码:
您现在的位置:首页 >> SEO开发技巧 >> 内容

lucene管理IndexReader和IndexWriter

时间:2009-12-17 14:00:53 点击:7173

  核心提示:实例化IndexReader是非常昂贵的操作,且它是一个线程安全的,跟索引目录是一一对应的,通常我们只需要实例化一个IndexReader。当索引数据足够大(G的数量级)的时候,一般把索引资源按照某种规则散列到多个文件目录里(如:index-0,index-1,index-2.... 或者 blog...
实例化IndexReader是非常昂贵的操作,且它是一个线程安全的,跟索引目录是一一对应的,通常我们只需要实例化一个IndexReader。当索引数据足够大(G的数量级)的时候,一般把索引资源按照某种规则散列到多个文件目录里(如:index-0,index-1,index-2.... 或者 blog,posts....),当然这些文件目录应该放在同一个根目录下---这时,最好的方式就是用一个Pool去维护这些IndexReader:保证一个文件目录只有一个实例,且不同的IndexReader可以动态的组合。


StandardIndexReaderPool.java
Java代码 复制代码
  1.   
  2. package com.qiu.search.pool.impl;   
  3.   
  4. import java.io.File;   
  5. import java.io.IOException;   
  6. import java.util.Iterator;   
  7. import java.util.List;   
  8. import java.util.Map;   
  9. import java.util.Map.Entry;   
  10. import java.util.concurrent.ConcurrentHashMap;   
  11.   
  12. import org.apache.commons.lang.builder.ToStringBuilder;   
  13. import org.apache.lucene.index.CorruptIndexException;   
  14. import org.apache.lucene.index.IndexReader;   
  15. import org.apache.lucene.store.FSDirectory;   
  16. import org.springframework.util.Assert;   
  17.   
  18. import com.dukuai.search.exception.PoolException;   
  19. import com.dukuai.search.pool.IndexReaderPool;   
  20. import com.dukuai.search.util.IndexResourceUtil;   
  21. import com.spinn3r.log5j.Logger;   
  22.   
  23. /**  
  24.  * {@link IndexReaderPool}的实现类。{@link StandardIndexReaderPool}确保一个目录至多只有一个{@link IndexReader},它是线程安全的,  
  25.  * {@link IndexReader}也是线程安全  
  26.  *   
  27.  */  
  28.   
  29. public class StandardIndexReaderPool implements IndexReaderPool {   
  30.     private static final Logger LOG = Logger.getLogger(StandardIndexReaderPool.class);   
  31.     /** 低版本的IndexReader的存活时间 5s */  
  32.     private static final int STALE_INDEXREADER_SURVIVAL_TIME = 5000;   
  33.   
  34.     private String name = null;   
  35.     // 索引文件的根目录的路径   
  36.     private