zoukankan      html  css  js  c++  java
  • SolrNet高级用法(分页、Facet查询、任意分组)

    前言

           如果你在系统中用到了Solr的话,那么肯定会碰到从Solr中反推数据的需求,基于数据库数据生产索引后,那么Solr索引的数据相对准确,在电商需求中经常会碰到菜单、导航分类(比如电脑、PC的话会有很多品牌)、新车二手车导航会有车的品牌。还会根据价格区间自由组合组成自定义查询条件。常用高级用法如下:

           1、根据基础数据反推数据分类用于导航(电脑品牌、手机品牌、车的品牌)。

           2、数据量大的要分页。

           3、自定义价格区间。

           4、时间段分组。

           5、高亮。

           以下我罗列三个我遇到的实际问题用来演示下SolrNet的实际用法。

         

    高级查询场景一(Facet 查询)

           在卖车类电商网站中,你选择了指定城市,那么你肯定只想在查询条件中查询出该城市已有车源的品牌,这样用户选择的查询条件就是有效的。这里用到Solr的Facet语法,Facet我理解为分片或者分类查询。用Facet Field查询的结果则在返回值的FacetFields字段中,他会把所有品牌的id都罗列出来,返回一个KeyValue,结果中是返回所有的品牌和对应的车源数量。车源数量大于0的则是该地区对应的品牌数据。

    ISolrOperations<SolrQuotePriceCore> solr = ServiceLocator.Current.GetInstance<ISolrOperations<SolrQuotePriceCore>>();
    
                //查找城市
                ISolrQuery q1 = new SolrQueryByField("provid", "540000"); //省份ID
                ISolrQuery q2 = new SolrQueryByField("cityid", "542400"); //市ID
                ISolrQuery q3 = new SolrQueryByField("selled", "1"); //在售状态
    
                IList<ISolrQuery> filter=new List<ISolrQuery>();
                filter.Add(q1);
                filter.Add(q2);
                filter.Add(q3);
                //分组
                var facet = new FacetParameters()
                {
                    Queries = new[]
                    {
                        new SolrFacetFieldQuery("brandid"),    
                    }
                };
    
                QueryOptions options=new QueryOptions();
                options.Facet = facet;
    
                SolrMultipleCriteriaQuery qtbo = new SolrMultipleCriteriaQuery(filter,"AND");
    
                SolrQueryResults<SolrQuotePriceCore> results = solr.Query(qtbo,options);
    
                foreach (var f in results.FacetFields["brandId"])
                {
                    if (f.Value > 0)
                        Console.WriteLine("{0}: {1}", f.Key, f.Value);
                }

    高级查询场景二(任意分组)

             上面是车源品牌,价格也一样,你想根据指定价格区间查询车源数据则就要用到任务分组。 任意分组的查询结果在返回值的FacetQueries中,遍历改keyvalue取值。

    ISolrOperations<SolrQuotePriceCore> solr = ServiceLocator.Current.GetInstance<ISolrOperations<SolrQuotePriceCore>>();
    
                ISolrQuery r1 = new SolrQueryByRange<decimal>("price", 0, 3m);
                ISolrQuery r2 = new SolrQueryByRange<decimal>("price", 3.01m, 5m);
                ISolrQuery r3 = new SolrQueryByRange<decimal>("price", 5.01m, 8m);
                ISolrQuery r4 = new SolrQueryByRange<decimal>("price", 8.01m, 10m);
                ISolrQuery r5 = new SolrQueryByRange<decimal>("price", 10.01m, 15m);
                ISolrQuery r6 = new SolrQueryByRange<decimal>("price", 15.01m, 20m);
                ISolrQuery r7 = new SolrQueryByRange<decimal>("price", 20.01m, 30m);
                ISolrQuery r8 = new SolrQueryByRange<decimal>("price", 30.01m, 50m);
                ISolrQuery r9 = new SolrQueryByRange<decimal>("price", 50.01m, 1000m);
    
                var facet = new FacetParameters()
                {
                    Queries = new[]
                    {
                        new SolrFacetQuery(r1),
                        new SolrFacetQuery(r2),
                        new SolrFacetQuery(r3),
                        new SolrFacetQuery(r4),
                        new SolrFacetQuery(r5),
                        new SolrFacetQuery(r6),
                        new SolrFacetQuery(r7),
                        new SolrFacetQuery(r8),
                        new SolrFacetQuery(r9)
                    }
                };
    
                ISolrQuery q1 = new SolrQueryByField("provid", "540000");
                ISolrQuery q2 = new SolrQueryByField("cityid", "542400");
                ISolrQuery q3 = new SolrQueryByField("selled", "1");
    
                IList<ISolrQuery> filter = new List<ISolrQuery>();
                filter.Add(q1);
                filter.Add(q2);
                filter.Add(q3);
    
                QueryOptions options=new QueryOptions();
                options.Facet = facet;
    
                var qTBO = new SolrMultipleCriteriaQuery(filter, "AND");
                SolrQueryResults<SolrQuotePriceCore> results = solr.Query(qTBO, options);
    
    
                foreach (var f in results.FacetQueries)
                {
                    Console.WriteLine("{0}: {1}", f.Key, f.Value);
                }

    高级查询场景三(分页)

    QueryOptions options = new QueryOptions();
    //分页参数
    options.Rows = pageNum; //数据条数
    options.Start = start;  //开始项    
    // 拼接相关查询条件
           
     //执行查询
     SolrQueryResults<Product> results = solr.Query(qTBO, options);
    
    // 得到返回的数据总条数和total和 总页数 用于分页显示,
    var total = results.NumFound;
    var pageCount = total / pageNum + 1;   

    总结

          查询用到的接口和类ISolrQuery、SolrQueryByField、有多个查询条件需要构造一个SolrMultipleCriteriaQuery类以及查询条件之间的逻辑关系(AND、OR)。类似Facet、Sort、OrderBy、Highlight、SpellCheck都在QueryOptions里。

    参考资料

          http://www.cnblogs.com/zhangweizhong/p/5075277.html?utm_source=tuicool&utm_medium=referral

  • 相关阅读:
    【C++11】准备:gcc 4.9.0编译安装
    【转】C++ 虚函数表解析
    【工作总结】内存泄漏总结
    【工作总结】C++ string工具类
    工作总结
    【工作笔记】CxImage简介
    【工作笔记】没有界面程序调用ActiveX控件
    【工作笔记】npapi插件编写
    【工作笔记】VLC播放器在chrome中的调用
    Linux多任务编程之三:exec函数族及其基础实验(转)
  • 原文地址:https://www.cnblogs.com/sword-successful/p/5664146.html
Copyright © 2011-2022 走看看