/// <summary>
        /// method to return the whole Lucene search index
        /// </summary>
        /// <returns></returns>
        public IEnumerable <LearningCourseDTO> GetAllIndexRecords()
        {
            // validate search index
            if (!System.IO.Directory.EnumerateFiles(_luceneDir).Any())
            {
                return(new List <LearningCourseDTO>());
            }

            // set up lucene searcher
            var searcher = new IndexSearcher(_directory, false);
            var reader   = IndexReader.Open(_directory, false);
            var docs     = new List <Document>();
            var term     = reader.TermDocs();

            while (term.Next())
            {
                docs.Add(searcher.Doc(term.Doc));
            }
            reader.Dispose();
            searcher.Dispose();

            var mapper = new LearningCourseMapper();

            return(mapper.MapLuceneToDataList(docs));
        }
Beispiel #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="searchQuery"></param>
        /// <param name="searchField"></param>
        /// <returns></returns>
        public IEnumerable <LearningCourseDTO> GetSearchResults(string searchQuery, string searchField = "")
        {
            // validation
            if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
            {
                return(new List <LearningCourseDTO>());
            }

            // set up lucene searcher
            using (var searcher = new IndexSearcher(_directory, false))
            {
                var hits_limit = 1000;
                var analyzer   = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);

                //if one need to add new field to search:
                //var parser = new MultiFieldQueryParser
                //(Version.LUCENE_30, new[] { "Id", "Name", "Description", "NEW_FIELD" }, analyzer);

                // search by single field
                if (!string.IsNullOrEmpty(searchField))
                {
                    var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, searchField, analyzer);
                    var query  = parseQuery(searchQuery, parser);
                    var hits   = searcher.Search(query, hits_limit).ScoreDocs;

                    var mapper = new LearningCourseMapper();

                    var results = mapper.MapLuceneToDataList(hits, searcher);

                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
                // search by multiple fields (ordered by RELEVANCE)

                else
                {
                    var parser = new MultiFieldQueryParser
                                     (Lucene.Net.Util.Version.LUCENE_30, new[] { "Name", "Description" }, analyzer);
                    var query = parseQuery(searchQuery, parser);
                    var hits  = searcher.Search
                                    (query, null, hits_limit, Sort.RELEVANCE).ScoreDocs;

                    var mapper = new LearningCourseMapper();

                    var results = mapper.MapLuceneToDataList(hits, searcher);

                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
            }
        }