public static Nest.SearchDescriptor <T> Paging <T>(this Nest.SearchDescriptor <T> descriptor, PagedQuery <T> request) where T : class, IResponse { descriptor = descriptor.Skip(request.Skip ?? 0).Take(request.Take ?? Int32.MaxValue); if (request.Filter != null) { descriptor = descriptor.Filter(f => f.Grid(request.Filter)); } if (request.Sort != null && request.Sort.Any()) { descriptor = descriptor.Sort(request.Sort); } return(descriptor); }
public static Nest.SearchDescriptor <T> Sort <T>(this Nest.SearchDescriptor <T> descriptor, IEnumerable <Sort> sorts) where T : class, IResponse { foreach (var sort in sorts) { if (sort.Dir == "desc") { descriptor = descriptor.SortDescending(sort.Field); } if (sort.Dir == "asc") { descriptor = descriptor.SortAscending(sort.Field); } } return(descriptor); }
private ISearchResults Search <T>(ISearchCriteria criteria) where T : EntryContentBase { // set up filters // 1: phrase var filters = new List <Nest.QueryContainer>(); if (criteria is CatalogEntrySearchCriteria) { var cesc = criteria as CatalogEntrySearchCriteria; if (!string.IsNullOrWhiteSpace(cesc.SearchPhrase)) { filters.Add(new Nest.QueryContainerDescriptor <T>().SimpleQueryString( sq => sq.Fields(f => f.Field("*.analyzed")).Query(cesc.SearchPhrase.Trim()))); } } // 2: id ... NOTE: Vulcan supports 1 and only 1 filter field, code if (criteria.ActiveFilterFields != null && criteria.ActiveFilterFields.Count() == 1 && criteria.ActiveFilterFields[0].Equals("code", StringComparison.InvariantCultureIgnoreCase)) { filters.Add(new Nest.QueryContainerDescriptor <T>().Term( p => p.Field(f => f.Code).Value((criteria.ActiveFilterValues[0] as SimpleValue).value))); } // 3: inactive... TODO, not sure what this should check! /* * if(!criteria.IncludeInactive) * { * filters.Add(new Nest.QueryContainerDescriptor<T>().Term( * p => p.Field(f => f.) * }*/ // get catalog filter, if needed var catalogReferences = new List <ContentReference>(); if (criteria is CatalogEntrySearchCriteria) { var cesc = criteria as CatalogEntrySearchCriteria; if (cesc.CatalogNames != null) { var catalogs = ContentLoader.Service.GetChildren <CatalogContent>(ReferenceConverter.Service.GetRootLink()); if (catalogs != null && catalogs.Any()) { foreach (var catalogName in cesc.CatalogNames) { var catalog = catalogs.FirstOrDefault(c => c.Name.Equals(catalogName, StringComparison.InvariantCultureIgnoreCase)); if (catalog != null) { catalogReferences.Add(catalog.ContentLink); } } } } } if (!catalogReferences.Any()) { catalogReferences = null; } // do search var searchDescriptor = new Nest.SearchDescriptor <T>(); searchDescriptor.Skip(criteria.StartingRecord); searchDescriptor.Take(criteria.RecordsToRetrieve); if (filters.Any()) { searchDescriptor.Query(q => q.Bool(b => b.Must(filters.ToArray()))); } var client = VulcanHandler.Service.GetClient(new CultureInfo(criteria.Locale)); var results = client.SearchContent <T>(q => searchDescriptor, false, catalogReferences); //var id = ReferenceConverter.Service.GetObjectId(); var searchDocuments = new SearchDocuments() { TotalCount = Convert.ToInt32(results.Total) }; if (results.Hits != null && results.Hits.Any()) { foreach (var hit in results.Hits) { var doc = new SearchDocument(); doc.Add(new SearchField("_id", ReferenceConverter.Service.GetObjectId(hit.Source.ContentLink))); searchDocuments.Add(doc); } } return(new SearchResults(searchDocuments, criteria)); }