Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
 /// <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;
 }