public static BoolFilter<ESDocument> CreateQueryForValue(ISearchCriteria criteria, ISearchFilter filter, ISearchFilterValue value) { var query = new BoolFilter<ESDocument>(); var field = filter.Key.ToLower(); if (filter.GetType() == typeof(PriceRangeFilter)) { var tempQuery = CreatePriceRangeFilter(criteria, field, value as RangeFilterValue); if (tempQuery != null) { query.Must(q => q.Bool(b => tempQuery)); } } else { if (value.GetType() == typeof(AttributeFilterValue)) { query.Must(q => q.Term(t=>t.Field(field).Value(((AttributeFilterValue)value).Value))); } else if (value.GetType() == typeof(RangeFilterValue)) { var tempValue = value as RangeFilterValue; var tempFilter = new RangeFilter<ESDocument>(); tempFilter.Field(field).From(tempValue.Lower).To(tempValue.Upper).IncludeLower(true).IncludeUpper(false); query.Should(q => q.Range(r => tempFilter)); } } return query; }
public static BoolFilter <ESDocument> CreateQueryForValue(ISearchCriteria criteria, ISearchFilter filter, ISearchFilterValue value) { var query = new BoolFilter <ESDocument>(); var field = filter.Key.ToLower(); if (filter.GetType() == typeof(PriceRangeFilter)) { var tempQuery = CreatePriceRangeFilter(criteria, field, value as RangeFilterValue); if (tempQuery != null) { query.Must(q => q.Bool(b => tempQuery)); } } else { if (value.GetType() == typeof(AttributeFilterValue)) { query.Must(q => q.Term(t => t.Field(field).Value(((AttributeFilterValue)value).Value))); } else if (value.GetType() == typeof(RangeFilterValue)) { var tempValue = value as RangeFilterValue; var tempFilter = new RangeFilter <ESDocument>(); tempFilter.Field(field).From(tempValue.Lower).To(tempValue.Upper).IncludeLower(true).IncludeUpper(false); query.Should(q => q.Range(r => tempFilter)); } } return(query); }
private static BoolFilter <ESDocument> CreatePriceRangeFilter(string[] priceLists, int index, string field, string currency, string lowerbound, string upperbound, bool lowerboundincluded, bool upperboundincluded) { var query = new BoolFilter <ESDocument>(); // create left part var filter = new RangeFilter <ESDocument>(); filter.Field(String.Format("{0}_{1}_{2}", field, currency, priceLists[index - 1].ToLower())) /*.From("*").To("*")*/.IncludeLower(lowerboundincluded).IncludeUpper(upperboundincluded); //query.MustNot(q => q.ConstantScore(c => c.Filter(f => f.Range(r => filter)))); query.MustNot(q => q.Range(r => filter)); // create right part if (index == priceLists.Count() - 1) // last element { var filter2 = new RangeFilter <ESDocument>(); filter2.Field(String.Format("{0}_{1}_{2}", field, currency, priceLists[index].ToLower())).From(lowerbound).To(upperbound).IncludeLower(lowerboundincluded).IncludeUpper(upperboundincluded); //query.Must(q => q.ConstantScore(c => c.Filter(f => f.Range(r => filter2)))); query.Must(q => q.Range(r => filter2)); } else { query.Should(q => q.Bool(b => CreatePriceRangeFilter(priceLists, index + 1, field, currency, lowerbound, upperbound, lowerboundincluded, upperboundincluded))); } return(query); }
/// <summary> /// Adds the facet queries. /// </summary> /// <param name="param">The param.</param> /// <param name="fieldName">Name of the field.</param> /// <param name="values">The values.</param> private void AddFacetQueries( Facets <ESDocument> param, string fieldName, IEnumerable <AttributeFilterValue> values, ISearchCriteria criteria) { if (values == null) { return; } var ffilter = new BoolFilter <ESDocument>(); foreach (var f in criteria.CurrentFilters) { if (!f.Key.Equals(fieldName)) { var q = ElasticQueryHelper.CreateQuery(criteria, f); ffilter.Must(ff => ff.Bool(bb => q)); } } var facetFilter = new FacetFilter <ESDocument>(); facetFilter.Bool(f => ffilter); //var filter = new FacetFilter<ESDocument>(); //facetFilter.Terms(x => x.Values(values.Select(y => y.Value).ToArray())); //var filterFacet = new FilterFacet<ESDocument>(); //filterFacet.FacetName(fieldName.ToLower()).FacetFilter(f => facetFilter); param.Terms(t => t.FacetName(fieldName.ToLower()).Field(fieldName.ToLower()).FacetFilter(ff => facetFilter)); }
private static BoolFilter<ESDocument> CreatePriceRangeFilter(string[] priceLists, int index, string field, string currency, string lowerbound, string upperbound, bool lowerboundincluded, bool upperboundincluded) { var query = new BoolFilter<ESDocument>(); // create left part var filter = new RangeFilter<ESDocument>(); filter.Field(String.Format("{0}_{1}_{2}", field, currency, priceLists[index - 1].ToLower()))/*.From("*").To("*")*/.IncludeLower(lowerboundincluded).IncludeUpper(upperboundincluded); //query.MustNot(q => q.ConstantScore(c => c.Filter(f => f.Range(r => filter)))); query.MustNot(q => q.Range(r => filter)); // create right part if (index == priceLists.Count() - 1) // last element { var filter2 = new RangeFilter<ESDocument>(); filter2.Field(String.Format("{0}_{1}_{2}", field, currency, priceLists[index].ToLower())).From(lowerbound).To(upperbound).IncludeLower(lowerboundincluded).IncludeUpper(upperboundincluded); //query.Must(q => q.ConstantScore(c => c.Filter(f => f.Range(r => filter2)))); query.Must(q => q.Range(r => filter2)); } else { query.Should(q => q.Bool(b => CreatePriceRangeFilter(priceLists, index + 1, field, currency, lowerbound, upperbound, lowerboundincluded, upperboundincluded))); } return query; }
public void SerializerBoolFilter() { JsonSerializer jsonSerializer = new JsonSerializer(); BoolFilter boolFilter = new BoolFilter(); boolFilter.Must(new TermFilter("term1", "value1")); boolFilter.Should(new TermFilter("term2", "value2")); boolFilter.Should(new TermFilter("term3", "value3")); string jsonString = jsonSerializer.Serialize(boolFilter); Console.WriteLine(jsonString); }
/// <summary> /// Adds the facet queries. /// </summary> /// <param name="param">The param.</param> /// <param name="fieldName">Name of the field.</param> /// <param name="criteria">Search criteria.</param> private void AddFacetQueries(Facets <ESDocument> param, string fieldName, ISearchCriteria criteria) { var ffilter = new BoolFilter <ESDocument>(); foreach (var f in criteria.CurrentFilters) { if (!f.Key.Equals(fieldName)) { var q = ElasticQueryHelper.CreateQuery(criteria, f); ffilter.Must(ff => ff.Bool(bb => q)); } } var facetFilter = new FacetFilter <ESDocument>(); facetFilter.Bool(f => ffilter); param.Terms(t => t.FacetName(fieldName.ToLower()).Field(fieldName.ToLower()).FacetFilter(ff => facetFilter)); }
public object BuildQuery(ISearchCriteria criteria) { var builder = new QueryBuilder <ESDocument>(); var mainFilter = new Filter <ESDocument>(); var mainQuery = new BoolQuery <ESDocument>(); #region Sorting // Add sort order if (criteria.Sort != null) { var fields = criteria.Sort.GetSort(); foreach (var field in fields) { builder.Sort(d => d.Field(field.FieldName, field.IsDescending ? SortDirection.desc : SortDirection.asc, ignoreUnmapped: field.IgnoredUnmapped)); } } #endregion #region Filters // Perform facet filters if (criteria.CurrentFilters != null) { var combinedFilter = new BoolFilter <ESDocument>(); // group filters foreach (var filter in criteria.CurrentFilters) { // Skip currencies that are not part of the filter if (filter.GetType() == typeof(PriceRangeFilter)) // special filtering { var priceRangeFilter = filter as PriceRangeFilter; if (priceRangeFilter != null) { var currency = priceRangeFilter.Currency; if (!currency.Equals(criteria.Currency, StringComparison.OrdinalIgnoreCase)) { continue; } } } var filterQuery = ElasticQueryHelper.CreateQuery(criteria, filter); if (filterQuery != null) { combinedFilter.Must(c => c.Bool(q => filterQuery)); } } mainFilter.Bool(bl => combinedFilter); } #endregion #region CatalogItemSearchCriteria if (criteria is CatalogItemSearchCriteria) { var c = criteria as CatalogItemSearchCriteria; mainQuery.Must(m => m .Range(r => r.Field("startdate").To(c.StartDate.ToString("s"))) ); if (c.StartDateFrom.HasValue) { mainQuery.Must(m => m .Range(r => r.Field("startdate").From(c.StartDateFrom.Value.ToString("s"))) ); } if (c.EndDate.HasValue) { mainQuery.Must(m => m .Range(r => r.Field("enddate").From(c.EndDate.Value.ToString("s"))) ); } mainQuery.Must(m => m.Term(t => t.Field("__hidden").Value("false"))); if (c.Outlines != null && c.Outlines.Count > 0) { AddQuery("__outline", mainQuery, c.Outlines); } if (!String.IsNullOrEmpty(c.SearchPhrase)) { var contentField = string.Format("__content_{0}", c.Locale.ToLower()); AddQueryString(mainQuery, c, "__content", contentField); } if (!String.IsNullOrEmpty(c.Catalog)) { AddQuery("catalog", mainQuery, c.Catalog); } if (c.ClassTypes != null && c.ClassTypes.Count > 0) { AddQuery("__type", mainQuery, c.ClassTypes, false); } } #endregion if (criteria is ElasticSearchCriteria) { var c = criteria as ElasticSearchCriteria; mainQuery.Must(m => m.Custom(c.RawQuery)); } builder.Query(q => q.Bool(b => mainQuery)); builder.Filter(f => mainFilter); // Add search facets var facets = GetFacets(criteria); builder.Facets(f => facets); return(builder); }
/// <summary> /// Adds the facet queries. /// </summary> /// <param name="param">The param.</param> /// <param name="fieldName">Name of the field.</param> /// <param name="values">The values.</param> private void AddFacetQueries( Facets<ESDocument> param, string fieldName, IEnumerable<AttributeFilterValue> values, ISearchCriteria criteria) { if (values == null) return; var ffilter = new BoolFilter<ESDocument>(); foreach (var f in criteria.CurrentFilters) { if (!f.Key.Equals(fieldName)) { var q = ElasticQueryHelper.CreateQuery(criteria, f); ffilter.Must(ff => ff.Bool(bb=>q)); } } var facetFilter = new FacetFilter<ESDocument>(); facetFilter.Bool(f => ffilter); //var filter = new FacetFilter<ESDocument>(); //facetFilter.Terms(x => x.Values(values.Select(y => y.Value).ToArray())); //var filterFacet = new FilterFacet<ESDocument>(); //filterFacet.FacetName(fieldName.ToLower()).FacetFilter(f => facetFilter); param.Terms(t => t.FacetName(fieldName.ToLower()).Field(fieldName.ToLower()).FacetFilter(ff => facetFilter)); }
public object BuildQuery(ISearchCriteria criteria) { var builder = new QueryBuilder<ESDocument>(); var mainFilter = new Filter<ESDocument>(); var mainQuery = new BoolQuery<ESDocument>(); #region Sorting // Add sort order if (criteria.Sort != null) { var fields = criteria.Sort.GetSort(); foreach (var field in fields) { builder.Sort(d => d.Field(field.FieldName, field.IsDescending ? SortDirection.desc : SortDirection.asc, ignoreUnmapped: field.IgnoredUnmapped)); } } #endregion #region Filters // Perform facet filters if (criteria.CurrentFilters != null) { var combinedFilter = new BoolFilter<ESDocument>(); // group filters foreach (var filter in criteria.CurrentFilters) { // Skip currencies that are not part of the filter if (filter.GetType() == typeof(PriceRangeFilter)) // special filtering { var priceRangeFilter = filter as PriceRangeFilter; if (priceRangeFilter != null) { var currency = priceRangeFilter.Currency; if (!currency.Equals(criteria.Currency, StringComparison.OrdinalIgnoreCase)) continue; } } var filterQuery = ElasticQueryHelper.CreateQuery(criteria, filter); if (filterQuery != null) { combinedFilter.Must(c => c.Bool(q=>filterQuery)); } } mainFilter.Bool(bl => combinedFilter); } #endregion #region CatalogItemSearchCriteria if (criteria is CatalogItemSearchCriteria) { var c = criteria as CatalogItemSearchCriteria; mainQuery.Must(m => m .Range(r => r.Field("startdate").To(c.StartDate.ToString("s"))) ); if (c.StartDateFrom.HasValue) { mainQuery.Must(m => m .Range(r => r.Field("startdate").From(c.StartDateFrom.Value.ToString("s"))) ); } if (c.EndDate.HasValue) { mainQuery.Must(m => m .Range(r => r.Field("enddate").From(c.EndDate.Value.ToString("s"))) ); } mainQuery.Must(m => m.Term(t => t.Field("__hidden").Value("false"))); if (c.Outlines != null && c.Outlines.Count > 0) AddQuery("__outline", mainQuery, c.Outlines); if (!String.IsNullOrEmpty(c.SearchPhrase)) { AddQueryString("__content", mainQuery, c); } if (!String.IsNullOrEmpty(c.Catalog)) { AddQuery("catalog", mainQuery, c.Catalog); } } #endregion if (criteria is ElasticSearchCriteria) { var c = criteria as ElasticSearchCriteria; mainQuery.Must(m => m.Custom(c.RawQuery)); } builder.Query(q => q.Bool(b => mainQuery)); builder.Filter(f => mainFilter); // Add search facets var facets = GetFacets(criteria); builder.Facets(f => facets); return builder; }
/// <summary> /// Adds the facet queries. /// </summary> /// <param name="param">The param.</param> /// <param name="fieldName">Name of the field.</param> /// <param name="criteria">Search criteria.</param> private void AddFacetQueries(Facets<ESDocument> param, string fieldName, ISearchCriteria criteria) { var ffilter = new BoolFilter<ESDocument>(); foreach (var f in criteria.CurrentFilters) { if (!f.Key.Equals(fieldName)) { var q = ElasticQueryHelper.CreateQuery(criteria, f); ffilter.Must(ff => ff.Bool(bb => q)); } } var facetFilter = new FacetFilter<ESDocument>(); facetFilter.Bool(f => ffilter); param.Terms(t => t.FacetName(fieldName.ToLower()).Field(fieldName.ToLower()).FacetFilter(ff => facetFilter)); }