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)); }
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); }