public IEnumerable <(string Term, T Data)> Search(string[] searchTerms, int maxHits = 100)
        {
            if (!_reader.IsCurrent())
            {
                using (_reader)
                {
                    _reader   = DirectoryReader.OpenIfChanged(_reader);
                    _searcher = new IndexSearcher(_reader);
                }
            }

            MultiPhraseQuery query = new MultiPhraseQuery();

            foreach (string searchTerm in searchTerms)
            {
                query.Add(new Term(TermsFieldName, searchTerm));
            }

            TopDocs hits = _searcher.Search(query, maxHits);

            foreach (ScoreDoc topDoc in hits.ScoreDocs)
            {
                Document document       = _reader.Document(topDoc.Doc);
                string   serializedData = document.GetField(DataFieldName).GetStringValue();
                T        t    = _serializer.Deserialize <T>(serializedData);
                string   term = document.GetField(TermsFieldName).GetStringValue();
                yield return(term, t);
            }
        }
            public void RefreshReaderSearcher()
            {
                lock (_refreshReaderLocker)
                {
                    if (_directoryReader == null || _directoryReader.IsCurrent())
                    {
                        return;
                    }

                    var oldReader = _directoryReader;

                    _directoryReader = _directoryWriter.GetReader(false);
                    var newSearcher = new IndexSearcher(_directoryReader);
                    Interlocked.Exchange(ref _indexSearcher, newSearcher);

                    oldReader.Dispose();

                    Console.WriteLine($"Index { _indexName }: Searcher updated");
                }
            }