Example #1
0
        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);
        }