我陷入了困境。事情是当tomcat重新启动时,我的所有索引都被删除了(注意我已经明确地注释掉了之前提到的代码)。因此,当我启动应用程序并进入搜索页面时,之前重启的索引保持不变。但是一旦我点击搜索,我就会得到java.io.FileNotFoundException: no segments* file found in org.apache.lucene.store.FSDirectory@/home/<path>: files:
并且索引文件夹位置中的所有索引都会被自动删除。我确保没有其他应用程序在不同的jvm上下文中运行,并且没有初始化其他索引编写器实例。所以我观察到的是,只要indexreader初始化,它就会删除所有以前的索引并抛出前面提到的异常。
发布上述异常,如果我将新文档添加到索引并搜索它,它可以正常工作但我丢失了所有以前索引的数据,这迫使我重新运行完整的重新索引并避免重新启动应用程序(因为每当我重启它,有人点击搜索以前的索引被删除)
public static IndexWriter getIndexWriter() throws Exception{
IndexWriterConfig idc = new IndexWriterConfig(Version.LATEST, TpCustomAnalyzer.getAnalyzer()).setOpenMode(OpenMode.CREATE_OR_APPEND);
idc.setRAMBufferSizeMB(1024);
String repositoryPath = RepositoryConstants.DEFAULT_REPOSITORY_PATH;
try {
return new IndexWriter(FSDirectory.open(new File(repositoryPath),new NativeFSLockFactory(new File(repositoryPath))),idc);
} catch (IOException e) {
throw e;
}
}
protected IndexSearcher getIndexSearcher() {
try {
if(searcher == null){
IndexReader idxReader = DirectoryReader.open(FSDirectory.open(new File(repositoryPath)));
searcher = new IndexSearcher(idxReader);
}
} catch (Exception e) {
TPLogger.getLogger().error("Unable to open index searcher", e);
}
return searcher;
}
我的班级做索引。
/**
* @author
*
*/
public class TPIndexerJob implements Runnable {
public void run() {
TPLogger.getLogger().debug("===== Started new Indexer Job ===============");
TPIndexEvent indexEvent = null;
try {
IndexWriter idxWriter = ParserUtils.getIndexWriter();
while ((indexEvent = TPIndexEventQueue.getNext()) != null) {
TPLogger.getLogger().debug("Processing Event ====> " + indexEvent);
IndexManager.processIndexEvent(indexEvent,idxWriter);
TPIndexEventQueue.removeFirst();
// Thread.sleep(1000);
}
idxWriter.commit();
idxWriter.close();
} catch (Exception e) {
TPLogger.getLogger().error("Error running indexer job",e);
}finally{
}
TPLogger.getLogger().debug("===== End Indexer Job ===============");
}
}
我按ctrl + c关闭tomcat是因为突然结束索引以某种方式被破坏了?
关闭tomcat后我的索引结构由以下文件组成: