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