求助:用RamDirectory做缓存时遇到的问题!
baidongli
2008-05-05
我在用lucene做索引的时候,用RamDirectory先缓存100条数据之后一起存入FSDirectory,为什么只能存入10条数据呢?
我用LukeAll观察也只有10条数据,这是为什么呢? 一下是具体代码: public class IndexDocs extends IndexBase{ private final Log logger = LogFactory.getLog(IndexDocs.class); private IndexWriter indexModifier; private File indexSaveDirectory; protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { long count = index(); } public long index() { int ramDocCount = 0; int ramDocSize = 100; /* * 设置 index parameter */ if(indexModifier == null) { try { afterPropertiesSet(); } catch (Exception e) { e.printStackTrace(); } } //控制多个segment合并的频率,值较大时建立索引速度较快,默认是10 //indexModifier.setMergeFactor(100); //控制写入一个新的segment前内存中保存的document的数目,设置较大的数目可以加快建索引速度,默认为10 //indexModifier.setMaxBufferedDocs(100); //控制一个segment中可以保存的最大document数目,值较小有利于追加索引的速度,默认Integer.MAX_VALUE,无需修改 //indexModifier.setMaxMergeDocs(Integer.MAX_VALUE); //indexModifier.setMaxFieldLength(1000000); //设置索引时,信息显示的终端 indexModifier.setInfoStream(System.out); long lastIndexId = 0; int dataFetchSize = 100000; List list=getServiceProvider().getGoodsService().getGoodsBuildList(new Long(lastIndexId),dataFetchSize); if(list != null && list.size()>0) { try { /* * RAM Directory Index Processing */ RAMDirectory ram = new RAMDirectory(); IndexModifier ramWriter = new IndexModifier(ram,this.getAnalyzer(),true); //ramWriter.setMaxBufferedDocs(100); //ramWriter.setMaxFieldLength(1000000); for(Iterator iterator = list.iterator();iterator.hasNext();) { Goods goods = (Goods)iterator.next(); Document doc = this.getDoc(goods); ramWriter.addDocument(doc); ramDocCount ++ ; if(ramDocCount % ramDocSize == 0) { indexModifier.addIndexesNoOptimize(new Directory[]{ram}); indexModifier.setUseCompoundFile(false); ramWriter.close(); ramWriter = new IndexModifier(ram,this.getAnalyzer(),true); logger.info("将内存中的索引数据存储到磁盘~~~"); } } System.out.print(ram.sizeInBytes()); if(ramDocCount % ramDocSize != 0) { indexModifier.addIndexesNoOptimize(new Directory[]{ram}); indexModifier.setUseCompoundFile(false); ramWriter.close(); logger.info("将内存中的索引数据存储到磁盘~~~索引结束"); } indexModifier.flush(); indexModifier.optimize(); return indexModifier.docCount(); } catch (IOException e) { logger.error(e,e); }finally{ try { indexModifier.close(); } catch (IOException e) { e.printStackTrace(); } } } return 0; } public void afterPropertiesSet() throws Exception { try{ indexSaveDirectory = new File(IndexDomain.NEW_GOODS_INDEX_PATH); if(!indexSaveDirectory.exists()){ if(!indexSaveDirectory.mkdirs()) { throw new RuntimeException("索引目录创建失败~~~!"); } createModifier(true); } else { try { createModifier(false); } catch (FileNotFoundException e) { createModifier(true); } } }catch(Exception e){ logger.error(e,e); } } private void createModifier(boolean create) throws IOException { FSDirectory fsdir = FSDirectory.getDirectory(indexSaveDirectory); if (IndexReader.isLocked(fsdir)) { IndexReader.unlock(fsdir); } indexModifier = new IndexWriter(indexSaveDirectory, this.getAnalyzer(), create); } public void destroy() throws Exception { try{ if(indexModifier != null) { indexModifier.close(); } }catch(Exception e){ logger.error(e,e); } } |