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();
            }
        }
Exemple #2
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);
        }
Exemple #3
0
        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();
            }
        }
Exemple #4
0
        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();
            }
        }
Exemple #5
0
        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();
            }
        }
Exemple #6
0
        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();
            }
        }