public static coreModel.AggregationItem ToModuleModel(this searchModel.Facet facet, params string[] appliedFilters) { var result = new coreModel.AggregationItem { Label = facet.Name, Value = facet.Key, Count = facet.Count, IsApplied = appliedFilters.Any(x => x.Equals(facet.Key, StringComparison.OrdinalIgnoreCase)) }; return(result); }
public static webModel.FacetValue ToWebModel(this coreModel.Facet facet, params string[] appliedFilters) { var retVal = new webModel.FacetValue { Label = facet.Name, Value = facet.Key, Count = facet.Count, IsApplied = appliedFilters.Any(x => x.Equals(facet.Key, StringComparison.OrdinalIgnoreCase)) }; return(retVal); }
public static coreModel.AggregationItem ToModuleModel(this searchModel.Facet facet, params string[] appliedFilters) { var result = new coreModel.AggregationItem { Value = facet.Key, Count = facet.Count, IsApplied = appliedFilters.Any(x => x.Equals(facet.Key, StringComparison.OrdinalIgnoreCase)) }; if (facet.Labels != null) { result.Labels = facet.Labels.Select(ToModuleModel).ToArray(); } return(result); }
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) { group.FacetType = FacetTypes.Attribute; 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) { group.FacetType = FacetTypes.PriceRange; 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) { group.FacetType = FacetTypes.Range; 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) { group.FacetType = FacetTypes.Category; 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; }
private FacetGroup CalculateResultCount(IndexReader reader, DocIdSet baseDocIdSet, ISearchFilter filter, ISearchCriteria criteria) { FacetGroup result = null; var values = filter.GetValues(); if (values != null) { BooleanFilter ffilter = null; foreach (var f in criteria.CurrentFilters) { if (!f.Key.Equals(filter.Key)) { if (ffilter == null) ffilter = new BooleanFilter(); var q = LuceneQueryHelper.CreateQuery(criteria, f, Occur.SHOULD); ffilter.Add(new FilterClause(q, Occur.MUST)); } } var groupLabels = filter.GetLabels(); var facetGroup = new FacetGroup(filter.Key, groupLabels); foreach (var group in values.GroupBy(v => v.Id)) { var value = group.FirstOrDefault(); var valueFilter = LuceneQueryHelper.CreateQueryForValue(Results.SearchCriteria, filter, value); if (valueFilter != null) { var queryFilter = new BooleanFilter(); queryFilter.Add(new FilterClause(valueFilter, Occur.MUST)); if (ffilter != null) queryFilter.Add(new FilterClause(ffilter, Occur.MUST)); var filterArray = queryFilter.GetDocIdSet(reader); var newCount = (int)CalculateFacetCount(baseDocIdSet, filterArray); if (newCount > 0) { var valueLabels = group.GetValueLabels(); var newFacet = new Facet(facetGroup, group.Key, newCount, valueLabels); facetGroup.Facets.Add(newFacet); } } } if (facetGroup.Facets.Any()) { result = facetGroup; } } return result; }
/// <summary> /// Calculates the result count. /// </summary> /// <param name="reader">The reader.</param> /// <param name="baseDocIdSet">The base doc id set.</param> /// <param name="facetGroup">The facet group.</param> /// <param name="filter">The filter.</param> /// <param name="criteria">The criteria.</param> /// <returns></returns> private int CalculateResultCount(IndexReader reader, DocIdSet baseDocIdSet, FacetGroup facetGroup, ISearchFilter filter, ISearchCriteria criteria) { var count = 0; var values = LuceneQueryHelper.GetFilterValues(filter); if (values == null) { return 0; } BooleanFilter ffilter = null; foreach (var f in criteria.CurrentFilters) { if (!f.Key.Equals(facetGroup.FieldName)) { if (ffilter == null) ffilter = new BooleanFilter(); var q = LuceneQueryHelper.CreateQuery(criteria, f, Occur.SHOULD); ffilter.Add(new FilterClause(q, Occur.MUST)); } } foreach (var value in values) { var queryFilter = new BooleanFilter(); var valueFilter = LuceneQueryHelper.CreateQueryForValue(Results.SearchCriteria, filter, value); if (valueFilter == null) continue; queryFilter.Add(new FilterClause(valueFilter, Occur.MUST)); if (ffilter != null) queryFilter.Add(new FilterClause(ffilter, Occur.MUST)); var filterArray = queryFilter.GetDocIdSet(reader); var newCount = (int)CalculateFacetCount(baseDocIdSet, filterArray); if (newCount == 0) continue; var newFacet = new Facet(facetGroup, value.Id, GetDescription(value, Results.SearchCriteria.Locale), newCount); facetGroup.Facets.Add(newFacet); count += newCount; } return count; }
private static FacetGroup[] CreateFacets(ISearchCriteria criteria, SearchResult<ESDocument>.SearchFacets facets) { var result = new List<FacetGroup>(); if (facets != null) { foreach (var filter in criteria.Filters) { var groupLabels = filter.GetLabels(); var facetGroup = new FacetGroup(filter.Key, groupLabels); var values = filter.GetValues(); // Return all facet terms for attribute filter if values are not defined if (values == null && filter is AttributeFilter) { facetGroup.FacetType = FacetTypes.Attribute; var key = filter.Key.ToLower(); if (facets.ContainsKey(key)) { var facet = facets[key] as TermsFacetResult; if (facet != null) { foreach (var term in facet.terms) { var newFacet = new Facet(facetGroup, term.term, term.count, null); facetGroup.Facets.Add(newFacet); } } } } if (values != null) { foreach (var group in values.GroupBy(v => v.Id)) { var valueLabels = group.GetValueLabels(); if (filter is AttributeFilter) { facetGroup.FacetType = FacetTypes.Attribute; var key = filter.Key.ToLower(); if (facets.ContainsKey(key)) { var facet = facets[key] as TermsFacetResult; if (facet != null) { var term = facet.terms.FirstOrDefault(t => t.term.Equals(group.Key, StringComparison.OrdinalIgnoreCase)); if (term != null) { var newFacet = new Facet(facetGroup, group.Key, term.count, valueLabels); facetGroup.Facets.Add(newFacet); } } } } else if (filter is PriceRangeFilter) { facetGroup.FacetType = FacetTypes.PriceRange; var rangeFilter = filter as PriceRangeFilter; if (rangeFilter.Currency.Equals(criteria.Currency, StringComparison.OrdinalIgnoreCase)) { var key = string.Format(CultureInfo.InvariantCulture, "{0}-{1}", filter.Key, group.Key).ToLower(); if (facets.ContainsKey(key)) { var facet = facets[key] as FilterFacetResult; if (facet != null && facet.count > 0) { var newFacet = new Facet(facetGroup, group.Key, facet.count, valueLabels); facetGroup.Facets.Add(newFacet); } } } } else if (filter is RangeFilter) { facetGroup.FacetType = FacetTypes.Range; var key = filter.Key.ToLower(); if (facets.ContainsKey(key)) { var facet = facets[key] as FilterFacetResult; if (facet != null && facet.count > 0) { var newFacet = new Facet(facetGroup, group.Key, facet.count, valueLabels); facetGroup.Facets.Add(newFacet); } } } else if (filter is CategoryFilter) { facetGroup.FacetType = FacetTypes.Category; var key = string.Format(CultureInfo.InvariantCulture, "{0}-{1}", filter.Key, group.Key).ToLower(); if (facets.ContainsKey(key)) { var facet = facets[key] as FilterFacetResult; if (facet != null && facet.count > 0) { var newFacet = new Facet(facetGroup, group.Key, facet.count, valueLabels); facetGroup.Facets.Add(newFacet); } } } } } // Add facet group only if has items if (facetGroup.Facets.Any()) { result.Add(facetGroup); } } } return result.ToArray(); }