public Task Filter(AdminSearchContext searchContext, BooleanFilter booleanFilter)
        {
            var contentTypeFilter = searchContext.Filters.FirstOrDefault(x => x.Key == IndexField);

            if (contentTypeFilter.Value == null)
            {
                return(Task.CompletedTask);
            }

            booleanFilter.Add(new FilterClause(new FieldCacheTermsFilter(contentTypeFilter.Key, contentTypeFilter.Value), Occur.MUST));
            return(Task.CompletedTask);
        }
        public async Task <IActionResult> Search(PagerParameters pagerParameters, IList <KeyValuePair <string, string[]> > filters, string searchTerm)
        {
            var siteSettings = await _siteService.GetSiteSettingsAsync();

            var searchContext = new AdminSearchContext
            {
                Index               = _adminSearchSettings.AdminSearchIndex,
                ContentTypes        = _contentDefinitionManager.ListTypeDefinitions().Select(c => c.Name).ToArray(), // TODO: Once content types have a setting for which indexes they use, this should be updated to obey that
                IndexFieldsToSearch = _adminSearchSettings.AdminSearchFields,
                PageSize            = pagerParameters.PageSize ?? siteSettings.PageSize,
                PageNumber          = pagerParameters.Page ?? 1,
                Filters             = filters,
                SearchTerm          = searchTerm
            };

            var searchResults = new AdminSearchResult();

            if (filters.Any() || !string.IsNullOrWhiteSpace(searchTerm))
            {
                searchResults = await _searchService.SearchContent(searchContext);
            }

            var model = new AdminSearchViewModel
            {
                SearchFilters    = await _adminSearchFilters.InvokeAsync(x => x.GetFilter(searchContext.ContentTypes), null),
                SearchTerm       = searchContext.SearchTerm,
                ContentItems     = searchResults.ContentItems,
                TotalRecordCount = searchResults.TotalRecordCount,
                PageSize         = searchContext.PageSize,
                PageNumber       = searchContext.PageNumber,
                Filters          = searchContext.Filters
            };

            var pager      = new Pager(pagerParameters, siteSettings.PageSize);
            var pagerShape = (await New.Pager(pager))
                             .TotalItemCount(searchResults.TotalRecordCount)
                             .ShowNext(searchResults.TotalRecordCount > searchContext.PageSize * (searchContext.PageNumber + 1));

            model.Pager = pagerShape;

            return(View(model));
        }
Beispiel #3
0
        public async Task <AdminSearchResult> SearchContent(AdminSearchContext searchContext)
        {
            var searchResult = new AdminSearchResult();

            await _luceneIndexProvider.SearchAsync(searchContext.Index, async searcher =>
            {
                Query query;
                if (string.IsNullOrWhiteSpace(searchContext.SearchTerm))
                {
                    query = new MatchAllDocsQuery();
                }
                else
                {
                    var luceneVersion = LuceneSettings.DefaultVersion;
                    var analyzer      = new StandardAnalyzer(luceneVersion);

                    var multiFieldQuery = new MultiFieldQueryParser(luceneVersion, searchContext.IndexFieldsToSearch, analyzer);
                    query = multiFieldQuery.Parse(QueryParserBase.Escape(searchContext.SearchTerm));
                }

                searchContext.PageNumber -= 1;

                var start = searchContext.PageNumber * searchContext.PageSize;
                var end   = searchContext.PageNumber * searchContext.PageSize + searchContext.PageSize;

                var collector = TopScoreDocCollector.Create(end, true);
                var filter    = new BooleanFilter();

                if (searchContext.ContentTypes.Any())
                {
                    filter.Add(new FieldCacheTermsFilter("Content.ContentItem.ContentType", searchContext.ContentTypes), Occur.MUST);
                }

                if (searchContext.Filters != null && searchContext.Filters.Any())
                {
                    await _searchFilters.InvokeAsync(x => x.Filter(searchContext, filter), null);
                }

                if (filter.Any())
                {
                    searcher.Search(query, filter, collector);
                }
                else
                {
                    searcher.Search(query, collector);
                }

                var docs = collector.GetTopDocs(start, end);
                searchResult.TotalRecordCount = docs.TotalHits;

                var contentItemIds = docs.ScoreDocs.Select(hit =>
                {
                    var doc = searcher.Doc(hit.Doc);
                    return(doc.GetField("ContentItemId").GetStringValue());
                });

                searchResult.ContentItems = await _contentManager.GetAsync(contentItemIds);
            });

            return(searchResult);
        }