我应该让 Lucene IndexWriter 打开整个索引还是在每次添加文档后关闭?
Should I keep Lucene IndexWriter open for entire indexing or close after each document addition?
每次添加文档后关闭 Lucene IndexWriter
是否会减慢我的索引进程?
我想,关闭和打开索引编写器会减慢我的索引进程或者 Lucene 不是这样吗?
基本上,我在 Spring 批处理作业中有一个 Lucene 索引器步骤,我正在 ItemProcessor
中创建索引。 Indexer Step 是一个分区步骤,我在创建 ItemProcessor
时创建 IndexWriter
并保持打开状态直到步骤完成。
@Bean
@StepScope
public ItemProcessor<InputVO,OutputVO> luceneIndexProcessor(@Value("#{stepExecutionContext[field1]}") String str) throws Exception{
boolean exists = IndexUtils.checkIndexDir(str);
String indexDir = IndexUtils.createAndGetIndexPath(str, exists);
IndexWriterUtils indexWriterUtils = new IndexWriterUtils(indexDir, exists);
IndexWriter indexWriter = indexWriterUtils.createIndexWriter();
return new LuceneIndexProcessor(indexWriter);
}
有没有办法在步骤完成后关闭此 IndexWriter
?
此外,我遇到了问题,因为我也在这一步中搜索以查找重复的文档,但我通过在打开 reader 和搜索之前添加 writer.commit();
来解决这个问题。
请问是每次添加文件后需要关闭再打开还是一直打开?以及如何关闭 StepExecutionListenerSupport
的 afterStep
?
最初,我关闭并重新打开每个文档,但索引过程非常缓慢,所以我认为这可能是原因。
由于在开发中,索引目录很小,所以我们可能看不到太多好处,但是对于大索引目录大小,我们不需要为 IndexWriter
和 [=13 做不必要的创建和关闭=].
在Spring批处理中,我通过这些步骤完成了
1.As指向,首先我们需要解决序列化问题,将对象放入ExecutionContext
。
2.We 在分区程序的 ExecutionContext
中创建并放置复合可序列化对象的实例。
3.Pass 值从 ExecutionContext
到您的步骤 reader,配置中的处理器或编写器,
@Bean
@StepScope
public ItemProcessor<InputVO,OutputVO> luceneIndexProcessor(@Value("#{stepExecutionContext[field1]}") String field1,@Value("#{stepExecutionContext[luceneObjects]}") SerializableLuceneObjects luceneObjects) throws Exception{
LuceneIndexProcessor indexProcessor =new LuceneIndexProcessor(luceneObjects);
return indexProcessor;
}
4.Use 这个实例在你需要的地方传入处理器并使用 getter 方法获取索引 reader 或 writer,public IndexWriter getLuceneIndexWriter() {return luceneIndexWriter;}
5.Finally 在 StepExecutionListenerSupport
的 afterStep(StepExecution stepExecution)
中关闭此作者或 reader 从 ExecutionContext
获取它。
ExecutionContext executionContext = stepExecution.getExecutionContext();
SerializableLuceneObjects slObjects = (SerializableLuceneObjects)executionContext.get("luceneObjects");
IndexWriter luceneIndexWriter = slObjects.getLuceneIndexWriter();
IndexReader luceneIndexReader = slObjects.getLuceneIndexReader();
if(luceneIndexWriter !=null ) luceneIndexWriter.close();
if(luceneIndexReader != null) luceneIndexReader.close();
每次添加文档后关闭 Lucene IndexWriter
是否会减慢我的索引进程?
我想,关闭和打开索引编写器会减慢我的索引进程或者 Lucene 不是这样吗?
基本上,我在 Spring 批处理作业中有一个 Lucene 索引器步骤,我正在 ItemProcessor
中创建索引。 Indexer Step 是一个分区步骤,我在创建 ItemProcessor
时创建 IndexWriter
并保持打开状态直到步骤完成。
@Bean
@StepScope
public ItemProcessor<InputVO,OutputVO> luceneIndexProcessor(@Value("#{stepExecutionContext[field1]}") String str) throws Exception{
boolean exists = IndexUtils.checkIndexDir(str);
String indexDir = IndexUtils.createAndGetIndexPath(str, exists);
IndexWriterUtils indexWriterUtils = new IndexWriterUtils(indexDir, exists);
IndexWriter indexWriter = indexWriterUtils.createIndexWriter();
return new LuceneIndexProcessor(indexWriter);
}
有没有办法在步骤完成后关闭此 IndexWriter
?
此外,我遇到了问题,因为我也在这一步中搜索以查找重复的文档,但我通过在打开 reader 和搜索之前添加 writer.commit();
来解决这个问题。
请问是每次添加文件后需要关闭再打开还是一直打开?以及如何关闭 StepExecutionListenerSupport
的 afterStep
?
最初,我关闭并重新打开每个文档,但索引过程非常缓慢,所以我认为这可能是原因。
由于在开发中,索引目录很小,所以我们可能看不到太多好处,但是对于大索引目录大小,我们不需要为 IndexWriter
和 [=13 做不必要的创建和关闭=].
在Spring批处理中,我通过这些步骤完成了
1.As指向ExecutionContext
。
2.We 在分区程序的 ExecutionContext
中创建并放置复合可序列化对象的实例。
3.Pass 值从 ExecutionContext
到您的步骤 reader,配置中的处理器或编写器,
@Bean
@StepScope
public ItemProcessor<InputVO,OutputVO> luceneIndexProcessor(@Value("#{stepExecutionContext[field1]}") String field1,@Value("#{stepExecutionContext[luceneObjects]}") SerializableLuceneObjects luceneObjects) throws Exception{
LuceneIndexProcessor indexProcessor =new LuceneIndexProcessor(luceneObjects);
return indexProcessor;
}
4.Use 这个实例在你需要的地方传入处理器并使用 getter 方法获取索引 reader 或 writer,public IndexWriter getLuceneIndexWriter() {return luceneIndexWriter;}
5.Finally 在 StepExecutionListenerSupport
的 afterStep(StepExecution stepExecution)
中关闭此作者或 reader 从 ExecutionContext
获取它。
ExecutionContext executionContext = stepExecution.getExecutionContext();
SerializableLuceneObjects slObjects = (SerializableLuceneObjects)executionContext.get("luceneObjects");
IndexWriter luceneIndexWriter = slObjects.getLuceneIndexWriter();
IndexReader luceneIndexReader = slObjects.getLuceneIndexReader();
if(luceneIndexWriter !=null ) luceneIndexWriter.close();
if(luceneIndexReader != null) luceneIndexReader.close();