/// <summary> /// Construtor padrão. /// </summary> /// <param name="searchResult"></param> /// <param name="searcher"></param> /// <param name="instance"></param> public RandomCollectorWrapper(SearchResult searchResult, global::Lucene.Net.Search.Searcher searcher, TopDocsCollector instance) : base(searchResult, searcher, instance) { _itemsCount = searchResult.Options.TotalHits; }
/// <summary> /// Construtor padrão. /// </summary> /// <param name="searchResult"></param> /// <param name="searcher"></param> /// <param name="instance"></param> public SummaryCollectorWrapper(SearchResult searchResult, global::Lucene.Net.Search.Searcher searcher, TopDocsCollector instance) : base(SearchResult.GetPriorityQueue(instance)) { _searchResult = searchResult; _instance = instance; _searcher = searcher; }
private static global::Lucene.Net.Util.PriorityQueue GetPriorityQueue(TopDocsCollector collector) { return((global::Lucene.Net.Util.PriorityQueue) typeof(TopDocsCollector).GetField("pq", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(collector)); }
/// <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); } }
public virtual PagedList <Models.ResultObject> Search(string key, int pageIndex, int pageSize, params string[] folders) { var indexDirectory = FSDirectory.Open(new DirectoryInfo(indexDir)); if (!IndexReader.IndexExists(indexDirectory) || string.IsNullOrEmpty(key) && (folders == null || folders.Length == 0)) { return(new PagedList <ResultObject>(new ResultObject[0], pageIndex, pageSize, 0)); } var query = new BooleanQuery(); key = QueryParser.Escape(key.Trim().ToLower()); if (string.IsNullOrEmpty(key)) { key = "*:*"; } QueryParser titleParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, Converter.TitleFieldName, this.Analyzer); var titleQuery = titleParser.Parse(key); titleQuery.SetBoost(2); query.Add(titleQuery, BooleanClause.Occur.SHOULD); QueryParser bodyParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, Converter.BodyFieldName, this.Analyzer); var bodyQuery = bodyParser.Parse(key); bodyQuery.SetBoost(1); query.Add(bodyQuery, BooleanClause.Occur.SHOULD); QueryWrapperFilter filter = null; if (folders != null && folders.Length > 0) { var folderQuery = new BooleanQuery(); //QueryParser folderParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "FolderName", this.Analyzer); foreach (var folder in folders) { var termQuery = new TermQuery(new Term("FolderName", folder)); termQuery.SetBoost(3); folderQuery.Add(termQuery, BooleanClause.Occur.SHOULD); } filter = new QueryWrapperFilter(folderQuery); } var searcher = new IndexSearcher(indexDirectory, true); TopDocsCollector collecltor = TopScoreDocCollector.create(searcher.MaxDoc(), false); if (filter == null) { searcher.Search(query, collecltor); } else { searcher.Search(query, filter, collecltor); } Lucene.Net.Highlight.Highlighter lighter = new Highlighter(new SimpleHTMLFormatter("<strong class='highlight'>", "</strong>"), new Lucene.Net.Highlight.QueryScorer((Query)query)); var startIndex = (pageIndex - 1) * pageSize; List <ResultObject> results = new List <ResultObject>(); foreach (var doc in collecltor.TopDocs(startIndex, pageSize).ScoreDocs) { var document = searcher.Doc(doc.doc); ResultObject result = Converter.ToResultObject(lighter, document); if (result != null) { results.Add(result); } } return(new PagedList <ResultObject>(results, pageIndex, pageSize, collecltor.GetTotalHits())); }
private IEnumerable <ContentSearchResult> EnumSearchResults(int start, Searcher searcher, TopDocsCollector collector, int limit) { TopDocs results = collector.TopDocs(); float max = results.GetMaxScore(); ScoreDoc[] found = results.scoreDocs; limit = Math.Min(limit, found.Length); for (int i = start; i < limit; i++) { ScoreDoc doc = found[i]; Document docInfo = searcher.Doc(doc.doc); ContentSearchResult.Builder builder = new ContentSearchResult.Builder(); builder.SetRanking((uint)Math.Max(0, Math.Min(100, (int)(doc.score / max * 100f)))); builder.SetUri(docInfo.GetField("uri").StringValue()); builder.SetTitle(docInfo.GetField("title").StringValue()); builder.SetBlurb(docInfo.GetField("blurb").StringValue()); builder.SetModified(DateTime.ParseExact(docInfo.GetField("modified").StringValue(), "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None)); ContentRecord record; if (TryGetValue(builder.Uri, out record)) { builder.SetRecord(record); } yield return(builder.Build()); } }