internal static void SaveResultsAndClearLucenePool(string luceneIndex) { ReadWriteLock.TryEnterWriteLock(IndexConstants.ReadWriteLockTimeOutMilliseconds); try { if (IndexReaderPool.TryRemove(luceneIndex, out var indexReader)) { indexReader.Dispose(); } if (IndexWritesPool.TryRemove(luceneIndex, out var indexWriter)) { indexWriter.Dispose(); } IndexSearcherPool.TryRemove(luceneIndex, out _); IndexGotChanged.AddOrUpdate(luceneIndex, u => 0, (u, v) => 0); } finally { ReadWriteLock.ExitWriteLock(); } }
static IndexSearcher CreateOrGetIndexSearcher(string luceneIndex) { IndexSearcher indexSearcher; if (!IndexSearcherPool.TryGetValue(luceneIndex, out indexSearcher) || IndexGotChanged.TryGetValue(luceneIndex, out var indexChangedTimes) && indexChangedTimes > 0) { lock (syncLockForSearcher) { if (!IndexSearcherPool.TryGetValue(luceneIndex, out indexSearcher)) { indexSearcher = new IndexSearcher(CreateOrGetIndexReader(luceneIndex, false)); IndexSearcherPool.TryAdd(luceneIndex, indexSearcher); } else if (IndexGotChanged.TryGetValue(luceneIndex, out indexChangedTimes) && indexChangedTimes > 0) { indexSearcher = new IndexSearcher(CreateOrGetIndexReader(luceneIndex, true)); IndexSearcherPool.AddOrUpdate(luceneIndex, indexSearcher, (u, v) => indexSearcher); IndexGotChanged.AddOrUpdate(luceneIndex, 0, (u, v) => 0); } } } if (!indexSearcher.IndexReader.TryIncRef()) { return(CreateOrGetIndexSearcher(luceneIndex)); } return(indexSearcher); }
internal static void UpdateIndex(string luceneIndex, Term term, Document document) { try { readWriteLock.TryEnterReadLock(Constants.ReadWriteLockTimeOutMilliseconds); var indexWriter = CreateOrGetIndexWriter(luceneIndex); indexWriter.UpdateDocument(term, document); IndexGotChanged.AddOrUpdate(luceneIndex, u => 0, (u, v) => v + 1); } finally { readWriteLock.ExitReadLock(); } }
internal static void DeleteIndex(string luceneIndex, params Query[] searchQueries) { try { readWriteLock.TryEnterReadLock(Constants.ReadWriteLockTimeOutMilliseconds); var indexWriter = CreateOrGetIndexWriter(luceneIndex); indexWriter.DeleteDocuments(searchQueries); IndexGotChanged.AddOrUpdate(luceneIndex, u => 0, (u, v) => v + 1); } finally { readWriteLock.ExitReadLock(); } }
internal static void DeleteAllIndex(string luceneIndex) { try { readWriteLock.TryEnterReadLock(Constants.ReadWriteLockTimeOutMilliseconds); var indexWriter = CreateOrGetIndexWriter(luceneIndex); indexWriter.DeleteAll(); indexWriter.Commit(); IndexGotChanged.AddOrUpdate(luceneIndex, u => 0, (u, v) => v + 1); } finally { readWriteLock.ExitReadLock(); } }
internal static void BuildIndex(string luceneIndex, bool triggerMerge, bool applyAllDeletes, IEnumerable <Document> documents, bool needFlush) { try { readWriteLock.TryEnterReadLock(Constants.ReadWriteLockTimeOutMilliseconds); var writer = CreateOrGetIndexWriter(luceneIndex); writer.AddDocuments(documents); if (needFlush) { writer.Flush(triggerMerge, applyAllDeletes); } IndexGotChanged.AddOrUpdate(luceneIndex, u => 0, (u, v) => v + 1); } finally { readWriteLock.ExitReadLock(); } }