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); }