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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        /// <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()));
            }
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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)));
 }
Ejemplo n.º 9
0
        //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);
            //}
        }
Ejemplo n.º 10
0
        /// <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);
        }