求助:用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);
}

}
Global site tag (gtag.js) - Google Analytics