public static void doIndex(string LuceneIndexDir, string SpellingIndexDir, IndexCreationMode indexCreationMode, IndexableFileInfo[] fileInfos, object ThreadState, onAddFileToIndex AddFileToIndex) { if (indexing) { return; } lock (padlock) { indexing = true; LuceneIndexer indexer = new LuceneIndexer(LuceneIndexDir, indexCreationMode); // create new index try { for (int i = 0; i < fileInfos.Length; i++) { IndexableFileInfo fi = fileInfos[i]; if (AddFileToIndex != null) { AddFileToIndex(fi, (double)i / (double)fileInfos.Length); } indexer.addFileInfoToIndex(fi); } // foreach } finally { indexer.CloseIndexWriter(OptimizeMode.DoNotOptimize); } if (indexCreationMode == IndexCreationMode.AppendToExistingIndex) { removeAllDuplicateAndDeletedFiles(fileInfos, LuceneIndexDir, indexCreationMode); } try { doSpellCheckerIndexing(LuceneIndexDir, SpellingIndexDir); } catch { } indexing = false; } } // doIndex
public LuceneIndexer(string LuceneIndexDir, IndexCreationMode indexCreationMode) { _luceneIndexDir = LuceneIndexDir; _indexCreationMode = indexCreationMode; if (_indexCreationMode == IndexCreationMode.AppendToExistingIndex && !System.IO.File.Exists(System.IO.Path.Combine(_luceneIndexDir, "segments"))) { // throw new ArgumentException("To Append to an existing index, one needs to exist already!!!"); _indexCreationMode = IndexCreationMode.CreateNewIndex; } try { if (_indexCreationMode == IndexCreationMode.CreateNewIndex) { writer = new IndexWriter(luceneIndexDir, new hatWebPortalAnalyzer(), true); } else if (_indexCreationMode == IndexCreationMode.AppendToExistingIndex) { writer = new IndexWriter(luceneIndexDir, new hatWebPortalAnalyzer(), false); } else { throw new ArgumentException("Invalid IndexCreationMode parameter"); } writer.SetUseCompoundFile(false); } catch (Exception ex) { if (ex.Message.IndexOf(@"\_svn") > -1 || ex.Message.IndexOf(@"\.svn") > -1) { throw new Exception("Please remove the SVN directory under \"" + luceneIndexDir + "\" - this is the only way the indexing can work"); } else { throw new Exception("Exception thrown when creating Hatfield.Web.Portal.Search.Lucene.LuceneIndexer", ex); } } } // constructor
} // doIndex private static void removeAllDuplicateAndDeletedFiles(IndexableFileInfo[] fileInfos, string LuceneIndexDir, IndexCreationMode indexCreationMode) { if (indexCreationMode != IndexCreationMode.AppendToExistingIndex) { return; } IndexReader reader = IndexReader.Open(LuceneIndexDir); try { int numDocs = reader.NumDocs(); for (int i = 0; i < numDocs; i++) { Document docToCheck = reader.Document(i); bool removeDocFromIndex = true; string filenameField = docToCheck.GetField("filename").StringValue(); string lastModified = (docToCheck.GetField("LastModified").StringValue()); foreach (IndexableFileInfo fi in fileInfos) { if (String.Compare(fi.Filename, filenameField, true) == 0 && DateTools.DateToString(fi.LastModified, DateTools.Resolution.SECOND) == lastModified) { removeDocFromIndex = false; break; } } // foreach if (removeDocFromIndex) { reader.DeleteDocument(i); if (!reader.HasDeletions()) { throw new Exception("error: deletion failed!!"); } } } // for each lucene doc } finally { reader.Close(); } LuceneIndexer indexer = new LuceneIndexer(LuceneIndexDir, indexCreationMode); // open up the index again indexer.CloseIndexWriter(OptimizeMode.DoOptimization); // just to optimize the index (which removes deleted items). }
public static void doIndex(string LuceneIndexDir, string SpellingIndexDir, IndexCreationMode indexCreationMode, IndexableFileInfo[] fileInfos, object ThreadState) { doIndex(LuceneIndexDir, SpellingIndexDir, indexCreationMode, fileInfos, ThreadState, null); }