Ejemplo n.º 1
0
        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));
        }