public RouteValueDictionary CreateRoutesForFacetFieldsExcept(string field, RouteValueDictionary routeValues, int index = 0) { IEnumerable <FacetParameter> filteredFacets = FacetParameters.Where(f => f.Name != field); CreateLinkWithParameters(routeValues, filteredFacets, index); return(routeValues); }
public static FacetParameters GetSolrNetFacetParameters(Query query, string facetNameToExclude = null) { if (query.Facets != null && query.Facets.Any()) { var facetParams = new FacetParameters { Queries = new List <ISolrFacetQuery>() }; foreach (var facet in query.Facets) { string facetName = facet.FieldName; if (!string.IsNullOrEmpty(facetNameToExclude) && facet.FieldName == facetNameToExclude) { facetName = new LocalParams { { "ex", DefaultSettings.DefaultExcludePrefix + facetNameToExclude } } +facetNameToExclude; } facetParams.Queries.Add(new SolrFacetFieldQuery(facetName) { MinCount = facet.MinCount ?? 1 }); } return(facetParams); } return(null); }
/// <summary> /// Gets Solr parameters for facet queries /// </summary> /// <param name="fp"></param> /// <returns></returns> public IEnumerable <KeyValuePair <string, string> > GetFacetFieldOptions(FacetParameters fp) { if (fp == null) { yield break; } if (fp.Queries == null || fp.Queries.Count == 0) { yield break; } yield return(KV.Create("facet", "true")); foreach (var fq in fp.Queries) { foreach (var fqv in facetQuerySerializer.Serialize(fq)) { yield return(fqv); } } if (fp.Prefix != null) { yield return(KV.Create("facet.prefix", fp.Prefix)); } if (fp.EnumCacheMinDf.HasValue) { yield return(KV.Create("facet.enum.cache.minDf", fp.EnumCacheMinDf.ToString())); } if (fp.Limit.HasValue) { yield return(KV.Create("facet.limit", fp.Limit.ToString())); } if (fp.MinCount.HasValue) { yield return(KV.Create("facet.mincount", fp.MinCount.ToString())); } if (fp.Missing.HasValue) { yield return(KV.Create("facet.missing", fp.Missing.ToString().ToLowerInvariant())); } if (fp.Offset.HasValue) { yield return(KV.Create("facet.offset", fp.Offset.ToString())); } if (fp.Sort.HasValue) { yield return(KV.Create("facet.sort", fp.Sort.ToString().ToLowerInvariant())); } if (fp.Threads.HasValue) { yield return(KV.Create("facet.threads", fp.Threads.ToString().ToLowerInvariant())); } }
public void FacetPivot() { SolrFacetPivotQuery f = new SolrFacetPivotQuery() { Fields = new[] { new Pivot().Field = "_cat1_,_cat2_,_cat3_,_cat4_" }, MinCount = 1 }; FacetParameters fp = new FacetParameters() { Queries = new[] { f } }; var qo = new QueryOptions(); qo.Facet = fp; qo.Rows = 0; var res = solr.Query("*:*", qo); }
public MovieResult AdvancedSearch(AdvancedSearch model) { FacetParameters parameters = new FacetParameters(); if (model.UseDate) { //parameters.Queries.Add(new SolrFacetDateQuery("")); } SolrQueryResults <Movie> results = _solr .Query(SolrQuery.All, new QueryOptions() { Rows = PageSize, Facet = parameters }); var result = new MovieResult { Movies = results.ToList(), }; return(result); }
public FacetParameters BuildFacetParameters() { var facetQueries = new List <ISolrFacetQuery>(); List <string> facetsAdded = new List <string>(); foreach (var facet in Facets) { if (facet.Value != null) { if (!facetsAdded.Contains(facet.Name)) { facetQueries.Add(new SolrFacetFieldQuery(new LocalParams { { "ex", facet.Name } } +facet.Name) { MinCount = 0, Limit = 550, Sort = false }); } facetsAdded.Add(facet.Name); } else { facetQueries.Add(new SolrFacetFieldQuery(facet.Name) { MinCount = 0, Limit = 550, Sort = false }); } } var facets = new FacetParameters { Queries = facetQueries }; return(facets); }
public bool HasFacetFieldValue(string facetField, string facetValue) { return(FacetParameters != null && FacetParameters.Any(f => f.Name == facetField && f.Value == facetValue)); }
public bool HasFilterForFacetField(string facetField) { return(FacetParameters != null && FacetParameters.Any(f => f.Name == facetField && !string.IsNullOrWhiteSpace(f.Value))); }
//public String GetBaseUri(HttpRequestBase req, UrlHelper url_helper) //{ // if (req.Url != null) // { // return string.Format("{0}://{1}{2}", req.Url.Scheme, req.Url.Authority, url_helper.Content("~")); // } // LogHelper.StatsLog(null, "GetBaseUri()", String.Format("Failed, request is null!"), null, null); // return "http://localhost/"; //} // public abstract SolrSearchResults Search(string term, List<string> ids, int rows, int row_start, string parent_id, List<SortField> sort_orders, List<KeyValuePair<string, string>> facet_constraints, List<KeyValuePair<string, string>> facets, List<FacetRange> facet_ranges); // public abstract SolrSearchResults GetRecord(string id); // public abstract SolrSearchResults GetSearchSuggestions(string str); public virtual SolrSearchResults Search(SearchQuery query, List <KeyValuePair <string, string> > facets, List <FacetRange> facet_ranges) { // string solr_term = (ids.Count > 0) ? String.Format("{0}:^", _solrIdField) : makeSolrTerm(term, ids); string solr_term = makeSolrTerm(query.Term, query.IDs); //if (String.IsNullOrEmpty(query.ParentID)) // solr_term = String.Format("{0} AND -{1}:[* TO *]", solr_term, ParentIdFieldName); //else // solr_term = String.Format("{0} AND {1}:{2}", solr_term, ParentIdFieldName, query.ParentID); if (String.IsNullOrEmpty(query.ParentID)) { solr_term = String.Format("{0} AND -{1}:[* TO *]", solr_term, ParentIdFieldName); } else { solr_term = String.Format("{0} AND {1}:{2}", solr_term, ParentIdFieldName, query.ParentID); } #region facet constraints var str = new StringBuilder(); var i = 0; foreach (FacetConstraint f in query.FacetConstraints) // KeyValuePair<string, List<string>> { int j = 0; str.Append("("); foreach (string val in f.Constraints) { if (val.Contains(" to ")) { // facet range, need to convert user friendly name sent by ajax back to correct db field name, if needed var fn = f.Field; foreach (FacetRange fr in facet_ranges) { if (fn == fr.DisplayName) { fn = fr.Field; break; } } // iterate over string list of values here, for multi valued constraints same key = OR, when going to different key AND // if not multi valued constraints then always AND? str.Append(String.Format("{0}:[{1}]", fn.Replace(":", @"\:"), val.ToUpper())); // str.Append("DateStartYear:[1800 TO 1900]"); } else { str.Append(String.Format("{0}:{1}{2}{3}", f.Field.Replace(":", @"\:"), "\"", val, "\"")); } j++; if (j != f.Constraints.Count) { str.Append(" OR "); } else { str.Append(")"); } } i++; if (i != query.FacetConstraints.Count) { //if(MultiFacetConstraints) // str.Append(" OR "); //else str.Append(" AND "); } } var d = new Dictionary <string, string> { { "fq", str.ToString() }, { "facet.sort", "count" } }; // ordering of the facets #endregion #region search term highlighting if (!String.IsNullOrEmpty(query.Term)) // if user has entered a search term then we want highlighting of that term in the results, if not we don't want it as adds overheads { d.Add("hl", "on"); d.Add("hl.fl", "*"); // d.Add("hl.fragsize", "0"); } #endregion search term highlighting #region facet queries // only needed if not multi facet constraints, as multi facet constraints are enabled then we don't need to refine the // available facets with the search (ie only return facets applicable to the search, the list obtained once at the start // remains valid, so no point adding overheads to this query // NB: if we are requesting 0 rows of results then this must be a request just for facet data, so in this case add the facet params var facet = new FacetParameters(); facet.Limit = FacetLimit; if ((MultiFacetConstraints == false) || (query.Rows == 0)) { var queries = new List <ISolrFacetQuery>(); foreach (KeyValuePair <string, string> kvp in facets) // these come from the app config { queries.Add(new SolrFacetFieldQuery(kvp.Key)); } // have to use the slightly crude method below as Facet by Range is in Solr 3.1+ but not exposed by solrnet // see no FaceRanges property exposed by Solr results object // Would want to use following: &facet.range=DateStartYear&f.DateStartYear.facet.range.start=1000&f.DateStartYear.facet.range.end=2100&f.DateStartYear.facet.range.gap=50 // Full query: http://armserv:8080/solr/core1/select?facet=true&facet.sort=count&start=0&q=*:*+AND+-ParentNodes:[*+TO+*]&?=&fq=&rows=0&facet.field=Genre&facet.range=DateStartYear&f.DateStartYear.facet.range.start=1000&f.DateStartYear.facet.range.end=2100&f.DateStartYear.facet.range.gap=50 foreach (FacetRange fr in facet_ranges) // these need to come from the app config { if (fr.WildcardLower) { queries.Add(new SolrFacetQuery(new SolrQueryByRange <string>(fr.Field, "*", (fr.From - 1).ToString()))); } for (int y = fr.From; y < fr.To; y = y + fr.Gap) { queries.Add(new SolrFacetQuery(new SolrQueryByRange <string>(fr.Field, y.ToString(), (y + (fr.Gap - 1)).ToString()))); } if (fr.WildcardUpper) { queries.Add(new SolrFacetQuery(new SolrQueryByRange <string>(fr.Field, (fr.To + 1).ToString(), "*"))); } } facet.Queries = queries; } #endregion #region sort orders var order_by = new List <SortOrder>(); foreach (SortField sf in query.SortFields) { SortOrder so; if (sf.DbField == "Random") { so = new RandomSortOrder("randomF"); } else { var order = Order.ASC; if (sf.SortDirection.ToLower() == "desc") { order = Order.DESC; } so = new SortOrder(sf.DbField, order); } order_by.Add(so); } #endregion sort orders // i think the below could be put in super classes, and makeSolrSearchResults changed to accept the disassembled properties of the specific IInqItem implementation #region ninject approach doesn't work, get "can't create instance of interface" error? /*using (IKernel kernel = new StandardKernel(new SolrNetModule(_solrUri))) * { * var solr = kernel.Get<ISolrOperations<IInqItem>>(); * try * { * var results = solr.Query(new SolrQuery(solr_term), new QueryOptions { Rows = rows, Start = row_start, Facet = facet, OrderBy = order_by, ExtraParams = d }); * return makeSolrSearchResults(results, facets, facet_ranges); * } * catch (Exception e) * { * throw new Exception("Fatal error, could not perform search, Solr not responding?: " + e.Message); * } * }*/ #endregion // var solr = ServiceLocator.Current.GetInstance<ISolrOperations<InqItemArmNode>>(); // var solr = ServiceLocator.Current.GetInstance<ISolrOperations<InqItemBod>>(); //try //{ var results = Solr.Query(new SolrQuery(solr_term), new QueryOptions { Rows = query.Rows, Start = query.RowStart, Facet = facet, OrderBy = order_by, ExtraParams = d }); return(makeSolrSearchResults(results, facets, facet_ranges)); //} //catch (Exception e) //{ // throw new Exception("Fatal error, could not perform search, Solr not responding or failed to create results?: " + e.Message); //} }
/// <summary> /// 根据搜索关键词和排序、筛选条件获取(第N页数据)检索数据 /// </summary> /// <param name="keyword">搜索关键词</param> /// <param name="sort">排序条件:1.新品排序 2.价格升序 3.价格降序 4.折扣升序</param> /// <param name="brands">筛选品牌:e.g. ["华为","小米","iphone"]</param> /// <returns>检索结果集合</returns> public SolrQueryResults <ProductSearchModel> GetProductListByOptionsAndPageIndex(string keyword, int sort, string brands, int pageIndex, int pageSize) { //创建solr对象 ISolrOperations <ProductSearchModel> solr = ServiceLocator.Current.GetInstance <ISolrOperations <ProductSearchModel> >(); //判断参数是否为空or所有 if (!string.IsNullOrEmpty(keyword) && keyword.Trim() != "*") { keyword = keyword.Trim().Replace(@"\", " "); keyword = StringVerify.StringToPattern(keyword);//转义这些Solr特殊字符 + - && || ! ( ) { } [ ] ^ ” ~ * ? : \ //string[] keywords = keyword.Split(' '); //创建条件集合 QueryOptions options = new QueryOptions(); options.Rows = pageSize; options.Start = pageSize * (pageIndex - 1); List <ISolrQuery> query = new List <ISolrQuery>(); //构建OR关系条件 List <ISolrQuery> keyOr = new List <ISolrQuery>(); //if (keywords.Length > 0) //{ // foreach (var k in keywords) // { // if (!string.IsNullOrEmpty(k.Trim())) // { // keyOr.Add(new SolrQuery("Name_IK:" + k)); // keyOr.Add(new SolrQuery("searchText:" + k)); // } // } //} //else //{ // keyword=keyword.Replace(" ", ""); // keyOr.Add(new SolrQuery("Name_IK:" +keywords)); // keyOr.Add(new SolrQuery("searchText:" + keywords)); //} keyOr.Add(new SolrQuery("Name_IK:" + keyword)); keyOr.Add(new SolrQuery("searchText:" + keyword)); var ko = new SolrMultipleCriteriaQuery(keyOr, "OR"); query.Add(ko); //排序条件 switch (sort) { case 1: //设定查询结果的排序,按照上架时间降序.[2016.7.20修改需求,上新排序改为默认的权重排序] //options.AddOrder(new SolrNet.SortOrder("OnSaleTime", SolrNet.Order.DESC)); break; case 2: //按照打折后的价格升序. options.AddOrder(new SolrNet.SortOrder("DiscountPrice", SolrNet.Order.ASC)); break; case 3: //按照打折后的价格降序. options.AddOrder(new SolrNet.SortOrder("DiscountPrice", SolrNet.Order.DESC)); break; case 4: //按照折扣升序.(1折、2折、3折...10折) options.AddOrder(new SolrNet.SortOrder("DiscountRate", SolrNet.Order.ASC)); break; default: break; } //品牌筛选 SolrQueryResults <ProductSearchModel> products; if (brands != "") { var blist = JsonHelper.ToObject <List <string> >(brands); //品牌筛选(&&操作)由于传过来的值肯定都是完整的品牌名称 //所以不用去Brand_IK中检索,而是直接去Brank中匹配 //构建OR关系条件 List <ISolrQuery> brandOr = new List <ISolrQuery>(); for (int i = 0; i < blist.Count; i++) { blist[i] = StringVerify.StringToPattern(blist[i]);//转义这些Solr特殊字符 + - && || ! ( ) { } [ ] ^ ” ~ * ? : \ brandOr.Add(new SolrQuery("Brand:" + blist[i])); } //foreach (var brand in blist) //{ // brandOr.Add(new SolrQuery("Brand:" + brand)); //} var bo = new SolrMultipleCriteriaQuery(brandOr, "OR"); query.Add(bo); //最终跟Query主条件进行构建 AND 关系条件 var querys = new SolrMultipleCriteriaQuery(query, "AND"); products = solr.Query(querys, options); } else { //输入关键词,检索数据,顺便给品牌分组,返回品牌数组 var facet = new FacetParameters { Queries = new[] { new SolrFacetFieldQuery("Brand") } }; options.Facet = facet; products = solr.Query(ko, options); } return(products); } return(null); }