/// <summary> /// Converts the specified facet to facet model. /// </summary> /// <param name="helper">The helper.</param> /// <param name="facet">The facet.</param> /// <returns> /// facet model /// </returns> public static FacetModel Convert(this SearchHelper helper, Facet facet) { return new FacetModel { Key = facet.Key, Name = GetDescriptionFromFilterValue(helper, facet.Group.FieldName, facet.Key), Count = facet.Count }; }
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; }
/// <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="currency">The currency.</param> /// <returns></returns> private int CalculateResultCount( IndexReader reader, DocIdSet baseDocIdSet, FacetGroup facetGroup, ISearchFilter filter, string currency) { var count = 0; ISearchFilterValue[] values = null; var priceQuery = false; if (filter is s.AttributeFilter) { values = ((s.AttributeFilter)filter).Values; } else if (filter is s.RangeFilter) { values = ((s.RangeFilter)filter).Values; } else if (filter is s.PriceRangeFilter) { values = ((s.PriceRangeFilter)filter).Values; priceQuery = true; } if (values == null) { return 0; } foreach (var value in values) { Query q = null; if (priceQuery) { q = LuceneQueryHelper.CreateQuery( this.Results.SearchCriteria, filter.Key, value as s.RangeFilterValue); } else { q = LuceneQueryHelper.CreateQuery(filter.Key, value); } if (q == null) continue; var queryFilter = new CachingWrapperFilter(new QueryWrapperFilter(q)); var filterArray = queryFilter.GetDocIdSet(reader); var newCount = (int)this.CalculateFacetCount(baseDocIdSet, filterArray); if (newCount == 0) continue; var newFacet = new Facet(facetGroup, value.Id, this.GetDescription(value, this.Results.SearchCriteria.Locale), newCount); facetGroup.Facets.Add(newFacet); count += newCount; } return count; }
/// <summary> /// Gets the description from filter value. /// </summary> /// <param name="helper">The helper.</param> /// <param name="facet">The facet.</param> /// <returns> /// System.String. /// </returns> private static string GetNameFromFilterValue(ISearchFilterService helper, Facet facet) { var key = facet.Group.FieldName; var id = facet.Key; var name = facet.Name; var d = (from f in helper.Filters where f.Key.Equals(key, StringComparison.OrdinalIgnoreCase) && (f as PriceRangeFilter == null || ((PriceRangeFilter)f).Currency.Equals(ClientContext.Clients.CreateCatalogClient().CustomerSession.Currency, StringComparison.OrdinalIgnoreCase)) select f).SingleOrDefault(); if (d != null) { var val = (from v in d.GetValues() where v.Id.Equals(id, StringComparison.OrdinalIgnoreCase) select v).SingleOrDefault(); if (val != null) { name = Convert(helper, val).Name; } } return name; }
/// <summary> /// Converts the specified facet to facet model. /// </summary> /// <param name="helper">The helper.</param> /// <param name="facet">The facet.</param> /// <returns> /// facet model /// </returns> public static FacetModel Convert(this ISearchFilterService helper, Facet facet) { return new FacetModel { Key = facet.Key, Name = GetNameFromFilterValue(helper, facet), Count = facet.Count }; }
/// <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="currency">The currency.</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(this.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)this.CalculateFacetCount(baseDocIdSet, filterArray); if (newCount == 0) continue; var newFacet = new Facet(facetGroup, value.Id, this.GetDescription(value, this.Results.SearchCriteria.Locale), newCount); facetGroup.Facets.Add(newFacet); count += newCount; } return count; }