public LuceneIndexWriterProvider(
     ILuceneDirectoryProvider directoryProvider,
     ILuceneAnalyzerProvider analyzerProvider)
 {
     IndexWriter = new Lazy <IndexWriter>(() =>
     {
         return(new IndexWriter(
                    directoryProvider.GetDirectory(),
                    analyzerProvider.GetAnalyzer(),
                    Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED));
     });
 }
示例#2
0
 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();
        }
示例#4
0
        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);
        }
示例#6
0
 public void CreateIndex(string indexName)
 {
     using (new IndexWriter(GetDirectory(indexName), _analyzerProvider.GetAnalyzer(indexName), true, IndexWriter.MaxFieldLength.UNLIMITED)) {
     }
 }
示例#7
0
        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);
        }