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