public ForumSearchResult Search(ForumSearchQuery searchQuery, bool direct = false) { _services.EventPublisher.Publish(new ForumSearchingEvent(searchQuery)); var totalHits = 0; int[] hitsEntityIds = null; Func <IList <ForumPost> > hitsFactory = null; IDictionary <string, FacetGroup> facets = null; if (searchQuery.Take > 0) { var query = GetPostQuery(searchQuery, null); totalHits = query.Count(); // Fix paging boundaries. if (searchQuery.Skip > 0 && searchQuery.Skip >= totalHits) { searchQuery.Slice((totalHits / searchQuery.Take) * searchQuery.Take, searchQuery.Take); } if (searchQuery.ResultFlags.HasFlag(SearchResultFlags.WithHits)) { var skip = searchQuery.PageIndex * searchQuery.Take; query = query .Skip(() => skip) .Take(() => searchQuery.Take); hitsEntityIds = query.Select(x => x.Id).ToArray(); hitsFactory = () => _forumService.GetPostsByIds(hitsEntityIds); } if (searchQuery.ResultFlags.HasFlag(SearchResultFlags.WithFacets) && searchQuery.FacetDescriptors.Any()) { facets = GetFacets(searchQuery, totalHits); } } var result = new ForumSearchResult( null, searchQuery, totalHits, hitsEntityIds, hitsFactory, null, facets); _services.EventPublisher.Publish(new ForumSearchedEvent(searchQuery, result)); return(result); }
public ForumSearchResult Search(ForumSearchQuery searchQuery, bool direct = false) { Guard.NotNull(searchQuery, nameof(searchQuery)); Guard.NotNegative(searchQuery.Take, nameof(searchQuery.Take)); var provider = _indexManager.GetIndexProvider("Forum"); if (!direct && provider != null) { var indexStore = provider.GetIndexStore("Forum"); if (indexStore.Exists) { var searchEngine = provider.GetSearchEngine(indexStore, searchQuery); var stepPrefix = searchEngine.GetType().Name + " - "; var totalCount = 0; int[] hitsEntityIds = null; string[] spellCheckerSuggestions = null; IEnumerable <ISearchHit> searchHits; Func <IList <ForumPost> > hitsFactory = null; IDictionary <string, FacetGroup> facets = null; _services.EventPublisher.Publish(new ForumSearchingEvent(searchQuery)); if (searchQuery.Take > 0) { using (_services.Chronometer.Step(stepPrefix + "Count")) { totalCount = searchEngine.Count(); // Fix paging boundaries. if (searchQuery.Skip > 0 && searchQuery.Skip >= totalCount) { searchQuery.Slice((totalCount / searchQuery.Take) * searchQuery.Take, searchQuery.Take); } } using (_services.Chronometer.Step(stepPrefix + "Hits")) { searchHits = searchEngine.Search(); } if (searchQuery.ResultFlags.HasFlag(SearchResultFlags.WithHits)) { using (_services.Chronometer.Step(stepPrefix + "Collect")) { hitsEntityIds = searchHits.Select(x => x.EntityId).ToArray(); hitsFactory = () => _forumService.Value.GetPostsByIds(hitsEntityIds); } } if (searchQuery.ResultFlags.HasFlag(SearchResultFlags.WithFacets)) { try { using (_services.Chronometer.Step(stepPrefix + "Facets")) { facets = searchEngine.GetFacetMap(); } } catch (Exception ex) { _logger.Error(ex); } } } if (searchQuery.ResultFlags.HasFlag(SearchResultFlags.WithSuggestions)) { try { using (_services.Chronometer.Step(stepPrefix + "Spellcheck")) { spellCheckerSuggestions = searchEngine.CheckSpelling(); } } catch (Exception ex) { // Spell checking should not break the search. _logger.Error(ex); } } var result = new ForumSearchResult( searchEngine, searchQuery, totalCount, hitsEntityIds, hitsFactory, spellCheckerSuggestions, facets); _services.EventPublisher.Publish(new ForumSearchedEvent(searchQuery, result)); return(result); } else if (searchQuery.Origin.IsCaseInsensitiveEqual("Boards/Search")) { IndexingRequiredNotification(_services, _urlHelper); } } return(SearchDirect(searchQuery)); }