public object BuildQuery <T>(string scope, ISearchCriteria criteria) where T : class { var queryBuilder = _luceneQueryBuilder.BuildQuery <T>(scope, criteria) as QueryBuilder; if (criteria is CatalogItemSearchCriteria || criteria is CategorySearchCriteria) { var query = queryBuilder.Query as BooleanQuery; var innerQuery = new BooleanQuery(); innerQuery.Add(new TermQuery(new Term("usergroups", "__null__")), Occur.SHOULD); var userName = _userNameResolver.GetCurrentUserName(); var userAccount = System.Threading.Tasks.Task.Factory.StartNew(s => ((ISecurityService)s).FindByNameAsync(userName, UserDetails.Reduced), _securityService, System.Threading.CancellationToken.None, System.Threading.Tasks.TaskCreationOptions.None, System.Threading.Tasks.TaskScheduler.Default).Unwrap().GetAwaiter().GetResult(); if (userAccount != null && !userAccount.MemberId.IsNullOrEmpty()) { var contact = _memberService.GetByIds(new[] { userAccount.MemberId }).FirstOrDefault(); if (contact != null) { if (!contact.Groups.IsNullOrEmpty()) { foreach (var userGroup in contact.Groups) { innerQuery.Add(new TermQuery(new Term("usergroups", userGroup.ToLowerInvariant())), Occur.SHOULD); } } } } query.Add(innerQuery, Occur.MUST); } return(queryBuilder); }
public virtual ISearchResults Search(string scope, ISearchCriteria criteria) { var command = new SearchCommand(scope, criteria.DocumentType); command.Size(criteria.RecordsToRetrieve); command.From(criteria.StartingRecord); // Add spell checking // TODO: options.SpellCheck = new SpellCheckingParameters { Collate = true }; // Build query var builder = (QueryBuilder <ESDocument>)_queryBuilder.BuildQuery(criteria); SearchResult <ESDocument> resultDocs; // Add some error handling try { resultDocs = Client.Search(command, builder); } catch (Exception ex) { throw new ElasticSearchException("Search using Elastic Search server failed, check logs for more details.", ex); } // Parse documents returned var docList = new List <ResultDocument>(); foreach (var indexDoc in resultDocs.Documents) { var document = new ResultDocument(); foreach (var field in indexDoc.Keys) { document.Add(new DocumentField(field, indexDoc[field])); } docList.Add(document); } var documents = new ResultDocumentSet { TotalCount = resultDocs.hits.total, Documents = docList.OfType <IDocument>().ToArray() }; // Create search results object var results = new SearchResults(criteria, new[] { documents }) { FacetGroups = CreateFacets(criteria, resultDocs.facets) }; return(results); }
public ISearchResults Search(string scope, ISearchCriteria criteria) { // Build query var builder = (SearchQuery)_queryBuilder.BuildQuery(criteria); SearchQueryResult resultDocs; // Add some error handling //try { var searchResponse = Client.Search(scope, builder).Result; if (!searchResponse.IsSuccess) { throw new AzureSearchException(AzureSearchHelper.FormatSearchException(searchResponse)); } resultDocs = searchResponse.Body; } /* * catch (Exception ex) * { * throw ex; * } * */ // Parse documents returned var documents = new ResultDocumentSet { TotalCount = resultDocs.Count }; var docList = new List <ResultDocument>(); foreach (var indexDoc in resultDocs.Records) { var document = new ResultDocument(); foreach (var field in indexDoc.Properties.Keys) { document.Add(new DocumentField(field, indexDoc.Properties[field])); } docList.Add(document); } documents.Documents = docList.ToArray(); // Create search results object var results = new SearchResults(criteria, new[] { documents }); return(results); }
public virtual ISearchResults Search(string scope, ISearchCriteria criteria) { var command = new SearchCommand(scope, criteria.DocumentType); command.Size(criteria.RecordsToRetrieve); command.From(criteria.StartingRecord); // Add spell checking // TODO: options.SpellCheck = new SpellCheckingParameters { Collate = true }; // Build query var builder = (QueryBuilder <ESDocument>)_queryBuilder.BuildQuery(criteria); SearchResult <ESDocument> resultDocs; // Add some error handling try { resultDocs = Client.Search(command, builder); } catch (Exception ex) { throw new ElasticSearchException("Search using Elastic Search server failed, check logs for more details.", ex); } // Parse documents returned var documents = new ResultDocumentSet { TotalCount = resultDocs.hits.total }; var docList = new List <ResultDocument>(); foreach (var indexDoc in resultDocs.Documents) { var document = new ResultDocument(); foreach (var field in indexDoc.Keys) { document.Add(new DocumentField(field, indexDoc[field])); } docList.Add(document); } documents.Documents = docList.ToArray(); // Create search results object var results = new SearchResults(criteria, new[] { documents }); // Now add facet results var groups = new List <FacetGroup>(); if (resultDocs.facets != null) { foreach (var filter in criteria.Filters) { var groupCount = 0; var group = new FacetGroup(filter.Key); if (filter is AttributeFilter) { var attributeFilter = filter as AttributeFilter; var myFilter = attributeFilter; var values = myFilter.Values; if (values != null) { var key = filter.Key.ToLower(); if (!resultDocs.facets.ContainsKey(key)) { continue; } var facet = resultDocs.facets[key] as TermsFacetResult; if (facet != null) { foreach (var value in values) { //facet.terms var termCount = from f in facet.terms where f.term.Equals(value.Id, StringComparison.OrdinalIgnoreCase) select f.count; var enumerable = termCount as int[] ?? termCount.ToArray(); if (!enumerable.Any()) { continue; } //var facet = from resultFacet var newFacet = new Facet(@group, value.Id, GetDescription(value, criteria.Locale), enumerable.SingleOrDefault()); @group.Facets.Add(newFacet); } groupCount++; } } } else if (filter is PriceRangeFilter) { var rangeFilter = filter as PriceRangeFilter; if (rangeFilter != null && rangeFilter.Currency.Equals(criteria.Currency, StringComparison.OrdinalIgnoreCase)) { var myFilter = rangeFilter; var values = myFilter.Values; if (values != null) { values = rangeFilter.Values; foreach (var value in values) { var key = String.Format("{0}-{1}", myFilter.Key, value.Id).ToLower(); if (!resultDocs.facets.ContainsKey(key)) { continue; } var facet = resultDocs.facets[key] as FilterFacetResult; if (facet != null && facet.count > 0) { if (facet.count == 0) { continue; } var myFacet = new Facet( @group, value.Id, GetDescription(value, criteria.Locale), facet.count); @group.Facets.Add(myFacet); groupCount++; } } } } } else if (filter is RangeFilter) { var myFilter = filter as RangeFilter; if (myFilter != null) { var values = myFilter.Values; if (values != null) { foreach (var value in values) { var facet = resultDocs.facets[filter.Key] as FilterFacetResult; if (facet == null || facet.count <= 0) { continue; } var myFacet = new Facet( @group, value.Id, GetDescription(value, criteria.Locale), facet.count); @group.Facets.Add(myFacet); groupCount++; } } } } else if (filter is CategoryFilter) { var myFilter = filter as CategoryFilter; if (myFilter != null) { var values = myFilter.Values; if (values != null) { foreach (var value in values) { var key = String.Format("{0}-{1}", myFilter.Key.ToLower(), value.Id.ToLower()).ToLower(); var facet = resultDocs.facets[key] as FilterFacetResult; if (facet == null || facet.count <= 0) { continue; } var myFacet = new Facet( @group, value.Id, GetDescription(value, criteria.Locale), facet.count); @group.Facets.Add(myFacet); groupCount++; } } } } // Add only if items exist under if (groupCount > 0) { groups.Add(group); } } } results.FacetGroups = groups.ToArray(); return(results); }
public object BuildQuery <T>(string scope, ISearchCriteria criteria) where T : class { return(_luceneQueryBuilder.BuildQuery <T>(scope, criteria)); }