コード例 #1
0
        /// <summary>
        /// Executa a pesquisa
        /// </summary>
        /// <returns></returns>
        private Collector ExecuteSearch(int pageIndex)
        {
            Collector        collector = null;
            TopDocsCollector result    = null;
            var totalHits = _options.RandomResult ? 1 : (pageIndex + 1) * (_options.HitsPerPage > 0 ? _options.HitsPerPage : 50);

            if (totalHits == 0)
            {
                totalHits = 1;
            }
            global::Lucene.Net.Search.Query query = _query;
            if (_sort != null && query == null)
            {
                var parser = new global::Lucene.Net.QueryParsers.QueryParser(global::Lucene.Net.Util.Version.LUCENE_29, "test", new global::Lucene.Net.Analysis.Standard.StandardAnalyzer(global::Lucene.Net.Util.Version.LUCENE_29, Stopwords.PORTUGUESE_SET));
                query  = parser.Parse("test:1");
                result = TopFieldCollector.create(_sort, totalHits, true, false, false, true);
            }
            if (query != null)
            {
                var weight = query.Weight(Searcher);
                collector = result = TopFieldCollector.create(_sort, totalHits, true, false, false, !weight.ScoresDocsOutOfOrder());
                if (_options.RandomResult)
                {
                    collector = new RandomCollectorWrapper(this, this.Searcher, result);
                }
                else if (_channelFields == null || _channelFields.Length == 0)
                {
                    collector = new SummaryCollectorWrapper(this, this.Searcher, result);
                }
                this.Searcher.Search(weight, _filter, collector);
                if (collector is SummaryCollectorWrapper)
                {
                    var sCollector = ((SummaryCollectorWrapper)collector);
                    _summaries     = sCollector.GetSummaries().ToList();
                    _channelFields = sCollector.GetChannelsFields().ToArray();
                }
                if (collector is RandomCollectorWrapper)
                {
                    var wrapper       = (RandomCollectorWrapper)collector;
                    var wrapperResult = wrapper.GetResult();
                    _result = wrapperResult is Element[] ? (Element[])wrapperResult : wrapperResult.ToArray();
                    _count  = _result.Length;
                    OnLoad();
                    return(null);
                }
                _count = result.GetTotalHits();
                OnLoad();
                return(result);
            }
            else
            {
                SummaryCollectorWrapper wrapper = null;
                if (_options.RandomResult)
                {
                    wrapper = new RandomCollectorWrapper(this);
                    _result = ((RandomCollectorWrapper)wrapper).GetResult().ToArray();
                }
                else
                {
                    collector      = wrapper = new SummaryCollectorWrapper(this);
                    _channelFields = wrapper.GetChannelsFields().ToArray();
                }
                _count     = wrapper.GetTotalHits();
                _summaries = wrapper.GetSummaries().ToList();
                OnLoad();
                return(wrapper);
            }
        }
コード例 #2
0
        /// <summary>
        /// Get searchterms from examineindex
        /// </summary>
        /// <param name="rootId">Where to start from</param>
        /// <param name="minLength">Min length of words to find</param>
        /// <returns></returns>
        public TermExtractorWrapper GetTerms(int rootId = -1, int minLength = 5)
        {
            var debugTimeStart = DateTime.Now;
            var debugTimeEnd = DateTime.MinValue;
            var termsList = new List<global::Lucene.Net.Index.Term>();                       // data to return
            var indexPath = GetIndexPath();                         // path to index
            var directory = FSDirectory.Open(indexPath);            //
            var indexReader = IndexReader.Open(directory, true);    //
            var searcher = new IndexSearcher(indexReader);          //searcher for checking if the term is valid
            var analyzer = new global::Lucene.Net.Analysis.Standard.StandardAnalyzer(global::Lucene.Net.Util.Version.LUCENE_29);

            foreach (var fieldName in FieldNames)
            {
                var tEnum = indexReader.Terms(new global::Lucene.Net.Index.Term(fieldName));

                do
                {
                    var t = tEnum.Term();

                    // filter in fieldname and minlength og term
                    if (t.Field() == fieldName && t.Text().Length >= minLength)
                    {
                        var searchPhrase = t.Text();
                        var parser = new global::Lucene.Net.QueryParsers.QueryParser(global::Lucene.Net.Util.Version.LUCENE_29, fieldName, analyzer);
                        var bq = new BooleanQuery();
                        var collector = TopScoreDocCollector.create(1, true);

                        var query = parser.Parse(searchPhrase);
                        bq.Add(query, BooleanClause.Occur.MUST);

                        searcher.Search(bq, collector);
                        var hits = collector.TopDocs().ScoreDocs;

                        if (hits.Any())
                        {
                            var docId = hits[0].doc;
                            var doc = searcher.Doc(docId);

                            if (doc.Get("path").Contains("," + rootId + ","))
                            {
                                termsList.Add(t);
                            }
                        }

                    }

                } while (tEnum.Next());
            }

            debugTimeEnd = DateTime.Now;

            return new TermExtractorWrapper
            {
                QueryTime = (debugTimeEnd - debugTimeStart).Milliseconds.ToString(),
                Terms = termsList
            };
        }