From 78d96c3afaf90fe25c8fbe1da6999309a6bfeaec Mon Sep 17 00:00:00 2001 From: bdc34 Date: Fri, 14 Jan 2011 16:52:47 +0000 Subject: [PATCH] Fixing lucene index startup so that it does not build a new index if not needed NIHVIVO-1701 --- .../webapp/search/lucene/LuceneIndexer.java | 26 +++++++++---------- .../webapp/search/lucene/LuceneSetup.java | 15 +++++------ 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/lucene/LuceneIndexer.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/lucene/LuceneIndexer.java index 1fcdb0bbf..a222ad7b3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/lucene/LuceneIndexer.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/lucene/LuceneIndexer.java @@ -20,10 +20,9 @@ import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; -import org.apache.lucene.index.TermDocs; -import org.apache.lucene.index.TermEnum; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; +import org.apache.lucene.store.LockObtainFailedException; import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.search.IndexingException; @@ -133,7 +132,7 @@ public class LuceneIndexer implements IndexerIface { this.currentOffLineDir = offLineDir; writer = new IndexWriter(offLineDir, analyzer, true, MAX_FIELD_LENGTH); }else{ - writer = new IndexWriter(this.liveIndexDir, analyzer, false, MAX_FIELD_LENGTH); + writer = getLiveIndexWriter(false); } indexing = true; urisIndexed = new HashSet(); @@ -340,13 +339,16 @@ public class LuceneIndexer implements IndexerIface { log.error("indexing should not be set to true just yet"); } - + private IndexWriter getLiveIndexWriter(boolean createNew) throws CorruptIndexException, LockObtainFailedException, IOException{ + return new IndexWriter(this.liveIndexDir, analyzer, createNew, MAX_FIELD_LENGTH); + } + private synchronized void makeEmptyIndexIfNone() throws IOException { if( !liveIndexExists() ){ log.debug("Making new index dir and initially empty lucene index at " + liveIndexDir); closeWriter(); makeIndexDirs(); - writer = new IndexWriter(liveIndexDir,analyzer,true,MAX_FIELD_LENGTH); + writer = getLiveIndexWriter(true); closeWriter(); } } @@ -405,17 +407,13 @@ public class LuceneIndexer implements IndexerIface { } } - public boolean isIndexEmpty() throws CorruptIndexException, IOException{ - TermDocs td = null; + public boolean isIndexEmpty() throws CorruptIndexException, IOException{ + IndexWriter writer = null; try{ - IndexReader reader = IndexReader.open(new File( this.liveIndexDir )); - td = reader.termDocs(new Term( Entity2LuceneDoc.VitroLuceneTermNames.DOCID) ); - if( td.next() ) - return false; - else - return true; + writer = getLiveIndexWriter(false); + return writer.numDocs() == 0; }finally{ - if (td != null) td.close(); + if (writer != null) writer.close(); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/lucene/LuceneSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/lucene/LuceneSetup.java index cdc06eabb..ac6f8144d 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/lucene/LuceneSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/lucene/LuceneSetup.java @@ -70,10 +70,9 @@ public class LuceneSetup implements javax.servlet.ServletContextListener { public void contextInitialized(ServletContextEvent sce) { try { ServletContext context = sce.getServletContext(); - log.debug("**** Running " + this.getClass().getName() + ".contextInitialized()"); String baseIndexDir = getBaseIndexDirName(); - log.info("Base directory of lucene full text index: " + baseIndexDir); + log.info("Seting up Lucene index. Base directory of lucene index: " + baseIndexDir); setBoolMax(); @@ -99,10 +98,10 @@ public class LuceneSetup implements javax.servlet.ServletContextListener { indexer.setLuceneIndexFactory(lif); if( indexer.isIndexCorroupt() ){ - log.info("index is corrupt, requesting rebuild"); + log.info("lucene index is corrupt, requesting rebuild"); } if( indexer.isIndexEmpty() ){ - log.info("index is empty, requesting rebuild"); + log.info("lucene index is empty, requesting rebuild"); sce.getServletContext().setAttribute(INDEX_REBUILD_REQUESTED_AT_STARTUP, Boolean.TRUE); } @@ -138,21 +137,21 @@ public class LuceneSetup implements javax.servlet.ServletContextListener { if( (Boolean)sce.getServletContext().getAttribute(INDEX_REBUILD_REQUESTED_AT_STARTUP) instanceof Boolean && (Boolean)sce.getServletContext().getAttribute(INDEX_REBUILD_REQUESTED_AT_STARTUP) ){ - log.info("Rebuild of search index required before startup."); + log.info("Rebuild of lucene index required before startup."); builder.doIndexRebuild(); Thread.currentThread().sleep(500); int n = 0; while( builder.isReindexRequested() || builder.isIndexing() ){ n++; if( n % 20 == 0 ) //output message every 10 sec. - log.info("Still rebulding search index"); + log.info("Still rebulding lucene index"); Thread.currentThread().sleep(500); } } - log.debug("**** End of " + this.getClass().getName() + ".contextInitialized()"); + log.info("Setup of Lucene index completed."); } catch (Throwable t) { - log.error("***** Error setting up Lucene search *****", t); + log.error("***** Error setting up Lucene index *****", t); throw new RuntimeException("Startup of vitro application was prevented by errors in the lucene configuration"); } }