public LuceneIndexWriterProvider( ILuceneDirectoryProvider directoryProvider, ILuceneAnalyzerProvider analyzerProvider) { IndexWriter = new Lazy <IndexWriter>(() => { return(new IndexWriter( directoryProvider.GetDirectory(), analyzerProvider.GetAnalyzer(), Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED)); }); }
public LuceneSearchBuilder(Directory directory, ILuceneAnalyzerProvider analyzerProvider, string indexName) { _directory = directory; _indexName = indexName; _analyzer = analyzerProvider.GetAnalyzer(_indexName); _count = MaxResults; _skip = 0; _clauses = new List <BooleanClause>(); _filters = new List <BooleanClause>(); _sort = String.Empty; _comparer = 0; _sortDescending = true; InitPendingClause(); }
public LuceneSearchBuilder( Directory directory, ILuceneAnalyzerProvider analyzerProvider, string indexName) { _directory = directory; _indexName = indexName; _analyzer = analyzerProvider.GetAnalyzer(_indexName); Logger = NullLogger.Instance; _count = MaxResults; _skip = 0; _clauses = new List<BooleanClause>(); _filters = new List<BooleanClause>(); _sort = String.Empty; _comparer = 0; _sortDescending = true; InitPendingClause(); }
public void Store(string indexName, IEnumerable <LuceneDocumentIndexTermVector> indexDocuments) { indexDocuments = indexDocuments.ToArray(); if (!indexDocuments.Any()) { return; } // Remove any previous document for these content items Delete(indexName, indexDocuments.Select(i => i.ContentItemId)); using (var writer = new IndexWriter(GetDirectory(indexName), _analyzerProvider.GetAnalyzer(indexName), false, IndexWriter.MaxFieldLength.UNLIMITED)) { foreach (var indexDocument in indexDocuments) { var doc = CreateDocument(indexDocument); writer.AddDocument(doc); Logger.Debug("Document [{0}] indexed", indexDocument.ContentItemId); } } }
public IEnumerable <ISearchHit> GetRelatedItems(int id, RelatedContentContext context) { IndexReader reader = IndexReader.Open(GetDirectory(context.Index), true); var indexSearcher = new IndexSearcher(reader); var analyzer = _analyzerProvider.GetAnalyzer(context.Index); var mlt = new MoreLikeThis(reader) { Boost = true, MinTermFreq = 1, Analyzer = analyzer, MinDocFreq = 1 }; if (context.FieldNames.Length > 0) { mlt.SetFieldNames(context.FieldNames); } var docid = GetDocumentId(id, indexSearcher); Filter filter; BooleanQuery query = (BooleanQuery)mlt.Like(docid); if (!String.IsNullOrWhiteSpace(context.ContentType)) { var contentTypeQuery = new TermQuery(new Term("type", context.ContentType)); query.Add(new BooleanClause(contentTypeQuery, Occur.MUST)); } // exclude same doc var exclude = new TermQuery(new Term("id", id.ToString())); query.Add(new BooleanClause(exclude, Occur.MUST_NOT)); TopDocs simDocs = indexSearcher.Search(query, context.Count); var results = simDocs.ScoreDocs .Select(scoreDoc => new LuceneSearchHit(indexSearcher.Doc(scoreDoc.Doc), scoreDoc.Score)); return(results); }
public void CreateIndex(string indexName) { using (new IndexWriter(GetDirectory(indexName), _analyzerProvider.GetAnalyzer(indexName), true, IndexWriter.MaxFieldLength.UNLIMITED)) { } }
public IEnumerable <SearchResult> Search( string queryString, string context, string subContext, out int totalResults, int maxResults) { totalResults = 0; queryString = (queryString ?? "").Replace(":", " "); if (string.IsNullOrWhiteSpace(queryString)) { return(new List <SearchResult>()); } queryString = AddContextCriteria(queryString, context, subContext); IndexSearcher indexSearcher = SearcherProvider.GetIndexSearcher(); var analyser = AnalyzerProvider.GetAnalyzer(); var queryParser = new QueryParser( Lucene.Net.Util.Version.LUCENE_30, Consts.FullTextFieldName, analyser); queryParser.AllowLeadingWildcard = true; queryParser.DefaultOperator = QueryParser.Operator.AND; var query = queryParser.Parse(queryString); var resultsCollector = TopScoreDocCollector.Create( numHits: 9999, docsScoredInOrder: true ); indexSearcher.Search( query: query, results: resultsCollector ); totalResults = resultsCollector.TotalHits; var result = new List <SearchResult>(); var highlighter = new FastVectorHighlighter(); var fieldQuery = highlighter.GetFieldQuery(query); foreach (var scoreDoc in resultsCollector.TopDocs().ScoreDocs.Take(maxResults)) { string[] fragments = highlighter.GetBestFragments( fieldQuery: fieldQuery, reader: indexSearcher.IndexReader, docId: scoreDoc.Doc, fieldName: Consts.FullTextFieldName, fragCharSize: 100, maxNumFragments: 5); var doc = indexSearcher.Doc(scoreDoc.Doc); var searchResult = new SearchResult( type: doc.Get(Consts.SerializedObjectTypeFieldName), document: doc, snippets: fragments ); result.Add(searchResult); } return(result); }