public async Task <ConsoleSearchResult> QueryAsync(ConsoleSearchQuery query) { if (_searchProvider == null || query == null) { return(null); } Thread.CurrentThread.CurrentCulture = UserSettings.CultureInfo; Thread.CurrentThread.CurrentUICulture = UserSettings.C1ConsoleUiLanguage; var documentSources = _docSourceProviders.SelectMany(dsp => dsp.GetDocumentSources()).ToList(); var allFields = documentSources.SelectMany(ds => ds.CustomFields).ToList(); var facetFields = RemoveDuplicateKeys( allFields .Where(f => f.FacetedSearchEnabled && f.Label != null), f => f.Name).ToList(); if (string.IsNullOrEmpty(query.Text)) { return(new ConsoleSearchResult { QueryText = string.Empty, FacetFields = EmptyFacetsFromSelections(query, facetFields), TotalHits = 0 }); } var selections = new List <SearchQuerySelection>(); if (query.Selections != null) { foreach (var selection in query.Selections) { string fieldName = ExtractFieldName(selection.FieldName); var field = allFields.Where(f => f.Facet != null) .FirstOrDefault(f => f.Name == fieldName); Verify.IsNotNull(field, $"Failed to find a facet field by name '{fieldName}'"); selections.Add(new SearchQuerySelection { FieldName = fieldName, Values = selection.Values, Operation = field.Facet.FacetType == FacetType.SingleValue ? SearchQuerySelectionOperation.Or : SearchQuerySelectionOperation.And }); } } var sortOptions = new List <SearchQuerySortOption>(); if (!string.IsNullOrEmpty(query.SortBy)) { string sortByFieldName = ExtractFieldName(query.SortBy); var sortTermsAs = allFields .Where(f => f.Name == sortByFieldName && f.Preview != null && f.Preview.Sortable) .Select(f => f.Preview.SortTermsAs) .FirstOrDefault(); sortOptions.Add(new SearchQuerySortOption(sortByFieldName, query.SortInReverseOrder, sortTermsAs)); } var culture = !string.IsNullOrEmpty(query.CultureName) ? new CultureInfo(query.CultureName) : UserSettings.ActiveLocaleCultureInfo; var searchQuery = new SearchQuery(query.Text, culture) { Facets = facetFields.Select(f => new KeyValuePair <string, DocumentFieldFacet>(f.Name, f.Facet)).ToList(), Selection = selections, SortOptions = sortOptions }; searchQuery.FilterByUser(UserSettings.Username); searchQuery.AddFieldFacet(DocumentFieldNames.Source); var result = await _searchProvider.SearchAsync(searchQuery); var items = result.Items.Evaluate(); if (!items.Any()) { return(new ConsoleSearchResult { QueryText = query.Text, FacetFields = EmptyFacetsFromSelections(query, facetFields), TotalHits = 0 }); } var documents = items.Select(m => m.Document); HashSet <string> dataSourceNames; Facet[] dsFacets; if (result.Facets != null && result.Facets.TryGetValue(DocumentFieldNames.Source, out dsFacets)) { dataSourceNames = new HashSet <string>(dsFacets.Select(v => v.Value)); } else { Log.LogWarning(nameof(ConsoleSearchRpcService), "The search provider did not return the list of document sources"); dataSourceNames = new HashSet <string>(documents.Select(d => d.Source).Distinct()); } var dataSources = documentSources.Where(d => dataSourceNames.Contains(d.Name)).ToList(); var previewFields = RemoveDuplicateKeys( dataSources .SelectMany(ds => ds.CustomFields) .Where(f => f.FieldValuePreserved), f => f.Name).ToList(); return(new ConsoleSearchResult { QueryText = query.Text, Columns = previewFields.Select(pf => new ConsoleSearchResultColumn { FieldName = MakeFieldNameJsFriendly(pf.Name), Label = StringResourceSystemFacade.ParseString(pf.Label), Sortable = pf.Preview.Sortable }).ToArray(), Rows = documents.Select(doc => new ConsoleSearchResultRow { Label = doc.Label, Url = GetFocusUrl(doc.SerializedEntityToken), Values = GetPreviewValues(doc, previewFields) }).ToArray(), FacetFields = GetFacets(result, facetFields), TotalHits = result.TotalHits }); }
private static WebsiteSearchResult SearchUsingSearchProvider(WebsiteSearchQuery query) { string text = string.Join(" ", query.Keywords); var searchQuery = new SearchQuery(text, query.Culture) { MaxDocumentsNumber = query.PageSize, SearchResultOffset = query.PageSize * query.PageNumber, SortOptions = query.SortOptions, HighlightSettings = { Enabled = true, FragmentsCount = 1, FragmentSize = 120 } }; var allFields = SearchFacade.DocumentSources.SelectMany(ds => ds.CustomFields).ToList(); foreach (var facet in query.Facets ?? Enumerable.Empty <WebsiteSearchQueryFacet>()) { // TODO: use an overload for SearchQuery.AddFieldFacet(...) once C1 6.2 is out searchQuery.AddFieldFacet(facet.Name); var field = allFields.Where(f => f.Facet != null).FirstOrDefault(f => f.Name == facet.Name); if (facet.Selections != null && facet.Selections.Length > 0) { searchQuery.Selection.Add(new SearchQuerySelection { FieldName = facet.Name, Values = facet.Selections, Operation = field.Facet.FacetType == FacetType.SingleValue ? SearchQuerySelectionOperation.Or : SearchQuerySelectionOperation.And }); } } searchQuery.ShowOnlyDocumentsWithUrls(); var filterByAncestors = new List <EntityToken>(); if (query.CurrentSiteOnly) { filterByAncestors.Add(GetRootPageEntityToken()); } if (query.FilterByAncestorEntityTokens?.Any() ?? false) { filterByAncestors.AddRange(query.FilterByAncestorEntityTokens); } if (filterByAncestors.Any()) { searchQuery.FilterByAncestors(filterByAncestors.ToArray()); } if (query.DataTypes != null && query.DataTypes.Length > 0) { searchQuery.FilterByDataTypes(query.DataTypes); } if (query.PageTypes != null && query.PageTypes.Length > 0) { searchQuery.Selection.Add(new SearchQuerySelection { FieldName = PageTypeIdFieldName, Operation = SearchQuerySelectionOperation.Or, Values = query.PageTypes }); } var result = SearchFacade.SearchProvider.SearchAsync(searchQuery).Result; if (result == null) { return(new WebsiteSearchResult()); } return(new WebsiteSearchResult { Entries = result.Items.Select(ToSearchResultEntry).ToList(), Facets = GetFacets(query, result, allFields), ResultsFound = result.TotalHits }); }