/// <summary> /// Searches the index. /// </summary> /// <param name="queryText"></param> /// <param name="keywordFilter">A Hashtable where the key is the fieldname of the keyword and /// the value the keyword itself.</param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> public SearchResultCollection Find(string queryText, Hashtable keywordFilter, int pageIndex, int pageSize) { long startTicks = DateTime.Now.Ticks; Hits hits; try { Query query = MultiFieldQueryParser.Parse(queryText, new string[] {"title", "contents"}, new StandardAnalyzer()); IndexSearcher searcher = new IndexSearcher(this._indexDirectory); if (keywordFilter != null && keywordFilter.Count > 0) { QueryFilter qf = BuildQueryFilterFromKeywordFilter(keywordFilter); hits = searcher.Search(query, qf); } else { hits = searcher.Search(query); } int start = pageIndex*pageSize; int end = (pageIndex + 1)*pageSize; if (hits.Length() <= end) { end = hits.Length(); } SearchResultCollection results = new SearchResultCollection(); results.TotalCount = hits.Length(); results.PageIndex = pageIndex; for (int i = start; i < end; i++) { SearchResult result = new SearchResult(); result.Title = hits.Doc(i).Get("title"); result.Summary = hits.Doc(i).Get("summary"); result.Author = hits.Doc(i).Get("author"); result.ModuleType = hits.Doc(i).Get("moduletype"); result.Path = hits.Doc(i).Get("path"); result.Category = hits.Doc(i).Get("category"); result.DateCreated = DateTime.Parse((hits.Doc(i).Get("datecreated"))); result.Score = hits.Score(i); result.Boost = hits.Doc(i).GetBoost(); result.SectionId = Int32.Parse(hits.Doc(i).Get("sectionid")); results.Add(result); } searcher.Close(); results.ExecutionTime = DateTime.Now.Ticks - startTicks; return results; } catch (Exception ex) { throw new SearchException("Error while performing full-text search.", ex); } }
/// <summary> /// A searchresult contains a SectionId propery that indicates to which section the /// result belongs. We need to get a real Section to determine if the current user /// has view access to that Section. /// </summary> /// <param name="nonFilteredResults"></param> /// <returns></returns> private SearchResultCollection FilterResults(SearchResultCollection nonFilteredResults) { long filterStartTicks = DateTime.Now.Ticks; SearchResultCollection filteredResults = new SearchResultCollection(); CoreRepository cr = HttpContext.Current.Items["CoreRepository"] as CoreRepository; if (cr != null) { foreach (SearchResult result in nonFilteredResults) { Section section = (Section)cr.GetObjectById(typeof(Section), result.SectionId); if (section.ViewAllowed(HttpContext.Current.User.Identity)) { filteredResults.Add(result); } } } filteredResults.ExecutionTime = DateTime.Now.Ticks - filterStartTicks + nonFilteredResults.ExecutionTime; return filteredResults; }