上一篇,讲到了SolrNet的基本用法及CURD,这个算是SolrNet 的入门知识介绍吧,昨天写完之后,有朋友评论说,这些感觉都被写烂了。没错,这些基本的用法,在网上百度,资料肯定一大堆,有一些写的肯定比我的好,不过,这个是Solr系列文章,会从Solr的基础入门讲到实际开发中的分页,高亮,Facet查询等高级用法。所以,基础的入门也会涉及一些,望大家见谅。我用这么多篇文章,来总结Solr 也是为了将Solr 的 安装,配置,开发等等,整个过程的资料,都能总结汇集到一起,这样不管是懂Solr还是不知道Solr 的人,都能按照我的文章,一步一步的学习入门。

下面就来讲一讲SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)。其实这些高级查询,说白了,也还是SolrNet 将Solr 的相关查询参数封装起来了,使得我们调用更加方便。但是实际上还是按照Solr 的参数规则,拼接查询参数,并向Solr 服务器发起请求。这就是所谓的万变不离其宗,这也是我前面花两篇文章,来总结Solr 的查询参数的初心。如果有兴趣可以监控SolrNet 发起的Http 请求,看看是不是按照solr 的查询参数规则来的。具体Solr的查询参数相关说明,请看这篇文章《Solr学习总结(四)Solr查询参数》

   示例下载:Demo下载

   1.复杂查询

  1.     public static void Query(string keyword, int category, string color, double price, int start, DateTime? startTime, DateTime? endTime, int pageNum)
  2. {
  3. //定义solr
  4. ISolrOperations<Product> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Product>>();
  5. QueryOptions options = new QueryOptions();//创建条件集合
  6. List<ISolrQuery> query = new List<ISolrQuery>();
  7.  
  8. if (!string.IsNullOrEmpty(keyword))
  9. {
  10. List<ISolrQuery> ar = new List<ISolrQuery>();
  11. string[] keywords = keyword.Split(new char[] { ',' });
  12. foreach (string a in keywords)
  13. {
  14. ar.Add(new SolrQueryByField("id", a));
  15. }
  16. //创建ID 条件集合的关系,是OR还是AND
  17. var kw = new SolrMultipleCriteriaQuery(ar, "OR");
  18. //添加至条件集合
  19. query.Add(kw);
  20. }
  21.  
  22. if (category > )
  23. {
  24. // 创建分类的查询条件
  25. var qCate = new SolrQueryByField("category", category.ToString());
  26. //添加条件
  27. query.Add(qCate);
  28. }
  29.  
  30. //查询颜色,多个颜色,用 ,号隔开 green,grey
  31. if (color != "")
  32. {
  33. //创建颜色条件集合
  34. List<ISolrQuery> ar = new List<ISolrQuery>();
  35. string[] colors = color.Split(new char[] { ',' });
  36. foreach (string a in colors)
  37. {
  38. ar.Add(new SolrQueryByField("color", a));
  39. }
  40.  
  41. //创建颜色查询条件的关系,是OR还是AND
  42. var qcolor = new SolrMultipleCriteriaQuery(ar, "OR");
  43.  
  44. //添加至条件集合
  45. query.Add(qcolor);
  46. }
  47.  
  48. //创建时间范围条件, 开始时间和结束时间
  49. SolrQueryByRange<DateTime> qDateRange = null;
  50. if (startTime != null && endTime != null)
  51. {
  52. var stime = DateTime.Parse(startTime.ToString());
  53. var etime = DateTime.Parse(endTime.ToString());
  54.  
  55. //后两个参数,一个是开始时间,一个是结束时时间
  56. qDateRange = new SolrQueryByRange<DateTime>("updatetime", stime, etime);
  57. //时间范围条件加入集合
  58. query.Add(qDateRange);
  59. }
  60.  
  61. //设定查询结果的排序,按照时间倒排序.
  62. options.AddOrder(new SolrNet.SortOrder("updatetime", Order.DESC));
  63.  
  64. //条件集合之间的关系
  65. var qTBO = new SolrMultipleCriteriaQuery(query, "AND");
  66.  
  67. //执行查询
  68. SolrQueryResults<Product> results = solr.Query(qTBO, options);
  69.        // 显示查询结果
  70. foreach (Product p in results)
  71. {
  72. Console.WriteLine("id:{0} name:{1} color:{2} price:{3}", p.id, p.name, p.color, p.price);
  73. }
  74. Console.ReadKey();
  75. }

   说明:a. QueryOptions 查询的相关设置,分页属性,结果集排序,条件集合之间的关系(AND, OR)等。

b. ISolrQuery 查询条件,集合

c. SolrMultipleCriteriaQuery条件集合之间的关系,(AND,OR)

   2.分页

      分页其实也就是比查询,多设置了Rows和Start 参数。其他的和查询一致。最后返回的时候,除了返回查询结果,还要返回总页数和数据总条数

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

   

   3.高亮  

  1. QueryOptions options = new QueryOptions();
  2.        
  3. var high = new HighlightingParameters();
  4. high.Fields = new List<string> { "color" };
  5. high.BeforeTerm = "<font color='red'><b>";
  6. high.AfterTerm = "</b></font>";
  7.  
  8. options.Highlight = high;
  9. // 拼接其他查询条件
  10. .
  11.        .
  12.        .
  13.        //执行查询
  14. SolrQueryResults<Product> results = solr.Query(qTBO, options);
  15.       // 处理需要高亮的字段
  16. var highlights = results.Highlights;
  17. foreach (var item in results)
  18. {
  19. var t = highlights[item.id.ToString()].Values.ToList()[].ToList()[];
  20. item.color = t;
  21. }
  22.  
  23. // 显示查询结果
  24. foreach (Product p in results)
  25. {
  26. Console.WriteLine("id:{0} name:{1} color:{2} price:{3}", p.id, p.name, p.color, p.price);
  27. }

   4.Facet查询

      Facet 本书还有很多参数来限制,选择结果集。这里只介绍了几个基本的Facet用法。其他的就不一一细说。大家自己去研究吧。

      1. 普通分组,按照某个字段分组

  1.       var facet = new FacetParameters
  2. {
  3. Queries = new[] { new SolrFacetFieldQuery("category") }
  4. };
  5.  
  6. options.Facet = facet;
  7.  
  8. var qTBO = new SolrMultipleCriteriaQuery(query, "AND");
  9.  
  10. SolrQueryResults<Product> results = solr.Query(qTBO, options);
  11.  
  12. foreach (var f in results.FacetFields["category"])
  13. {
  14. Console.WriteLine("{0}: {1}", f.Key, f.Value);
  15. }

      2. 时间段分组

        SolrFacetDateQuery 类里面的几个参数比较复杂。具体的可以去研究研究Date Facet 相关的参数说明。

  1.       // 时间分组
  2. var facet = new FacetParameters
  3. {
  4. Queries = new[] {
  5. new SolrFacetDateQuery(
  6. "updatetime",
  7. new DateTime(, , ) /* 开始时间 */,
  8. new DateTime(,, ) /* 结束时间 */,
  9. "+7DAY" /* 时间间隔 */)
  10. {
  11. HardEnd = true,
  12. Other = new[] {FacetDateOther.After, FacetDateOther.Before}
  13. },
  14. }
  15. };
  16.  
  17. options.Facet = facet;
  18.  
  19. //条件集合之间的关系
  20. var qTBO = new SolrMultipleCriteriaQuery(query, "AND");
  21.  
  22. SolrQueryResults<Product> results = solr.Query(qTBO, options);
  23.  
  24. DateFacetingResult dateFacetResult = results.FacetDates["updatetime"];
  25.  
  26. foreach (KeyValuePair<DateTime, int> dr in dateFacetResult.DateResults)
  27. {
  28. Console.WriteLine(dr.Key);
  29. Console.WriteLine(dr.Value);
  30. }

      3. 任意分组

  1.        // 按照价格段分组
  2. var lessThan30 = new SolrQueryByRange<decimal>("price", 0m, 30m);
  3. var lessThan70 = new SolrQueryByRange<decimal>("price", 30m, 70m);
  4. var moreThan70 = new SolrQueryByRange<decimal>("price", 70m, 100m);
  5.  
  6. var facet = new FacetParameters
  7. {
  8. Queries = new[] { new SolrFacetQuery(lessThan30), new SolrFacetQuery(lessThan70), new SolrFacetQuery(moreThan70) }
  9. };
  10.  
  11. options.Facet = facet;
  12.  
  13. var qTBO = new SolrMultipleCriteriaQuery(query, "AND");
  14.  
  15. SolrQueryResults<Product> results = solr.Query(qTBO, options);
  16. foreach (var f in results.FacetQueries)
  17. {
  18. Console.WriteLine("{0}: {1}", f.Key, f.Value);
  19. }

      

      4. Pivot faceting, Pivot 这个概念还是蛮难解释的,有点类似于BI 报表中的数据钻取,即 一层一层的进行分组 统计,例如 先按颜色,分组统计,然后在统计的结果集某个子分组里面,再按照 分类 进行分组统计。

  1. /// <summary>
  2. /// Facet 查询
  3. /// </summary>
  4. /// <param name="color"></param>
  5. public static void Query_FactPivot()
  6. {
  7. ISolrOperations<Product> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Product>>();
  8. //Create a facet Pivot Query
  9. var facetPivotQuery = new SolrFacetPivotQuery()
  10. {
  11. //默认是 1 pivot, 先 category 再按 color 分组
  12. //如果是多个,则在后面继续追加 ,new PivotFields("color", "category")
  13. Fields = new[] { new PivotFields("color", "category")},
  14.  
  15. //最小记录数
  16. MinCount =
  17. };
  18.  
  19. //创建一个查询参数
  20. //同时 pivotQueries 可以和其他查询条件一起混用
  21. var facetParams = new FacetParameters()
  22. {
  23. Queries = new[] { facetPivotQuery },
  24.  
  25. Limit =
  26. };
  27.  
  28. var queryOptions = new QueryOptions();
  29. queryOptions.Facet = facetParams;
  30. queryOptions.Rows = ;
  31.  
  32. var results = solr.Query("*:*", queryOptions);
  33. if (results.FacetPivots.Count > )
  34. {
  35. foreach (var pivotTable in results.FacetPivots)
  36. {
  37. Console. WriteLine("Pivot table for " + pivotTable.Key);
  38. foreach (var pivot in pivotTable.Value)
  39. {
  40. Console.WriteLine(" Pivot: " + pivot.Field + " with value " + pivot.Value + ". Child Pivots:");
  41. foreach (var pivotChild in pivot.ChildPivots)
  42. {
  43. Console.WriteLine(" - " + pivotChild.Value + " (" + pivotChild.Count + ")");
  44. }
  45. }
  46. }
  47. }
  48.  
  49. Console.ReadKey();
  50. }

      这个是比较精细化,也更加复杂的Facet查询。这个由于本人实际中没有用到过。所以就不在这里多讲了。感兴趣的朋友,可以去研究研究,

Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)的更多相关文章

  1. SolrNet高级用法(分页、Facet查询、任意分组)

    前言 如果你在系统中用到了Solr的话,那么肯定会碰到从Solr中反推数据的需求,基于数据库数据生产索引后,那么Solr索引的数据相对准确,在电商需求中经常会碰到菜单.导航分类(比如电脑.PC的话会有 ...

  2. solr学习(六):使用自定义int/long类型主键

    需求分析: 我不想使用solr默认的主键id,我想换成其他的,比如我的文章id为article_id,我想让article_id作为主键. 而且,我的主键是int类型,而solr的主键默认是strin ...

  3. vue3 学习笔记 (四)——vue3 setup() 高级用法

    本篇文章干货较多,建议收藏! 从 vue2 升级到 vue3,vue3 是可以兼容 vue2 的,所以 vue3 可以采用 vue2 的选项式API.由于选项式API一个变量存在于多处,如果出现问题时 ...

  4. Android(java)学习笔记264:Android下的属性动画高级用法(Property Animation)

    1. 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画 ...

  5. Android(java)学习笔记208:Android下的属性动画高级用法(Property Animation)

    1. 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画 ...

  6. Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法 ...

  7. django基础之day05,F与Q查询,Q查询的高级用法

    #F与Q查询 #*************************** F 查询 ******************** # F 查询数据库中的其他字段!!! #1.查询库存数大于卖出数的书籍 fr ...

  8. Solr学习总结(五)SolrNet的基本用法及CURD

    上一篇已经讲到了Solr 查询的相关的参数.这里在讲讲C#是如何通过客户端请求和接受solr服务器的数据, 这里推荐使用SolrNet,主要是:SolrNet使用非常方便,而且用户众多,一直都在更新, ...

  9. 《TomCat与Java Web开发技术详解》(第二版) 第五章节的学习总结 ---- Servlet的高级用法

    这一章节主要是介绍了Servlet技术的一些高级用法,如下是我自己的整理归纳 1.下载文件:即获取服务器文件,并把文件写入反馈给客户端 ServletContext.getResourceAsStre ...

随机推荐

  1. Spring MVC 框架的架包分析,功能作用,优点

    由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关j ...

  2. FIR on Hadoop using hadoop-streaming

    1.Prepare Hadoop Streaming Hadoop streaming allows you to create and run Map/Reduce jobs with any ex ...

  3. 自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解

    '*************************************************************************'**模 块 名:自写函数VB6 STUFF函数 和 ...

  4. 通过修改i8042prt端口驱动中类驱动Kbdclass的回调函数地址,达到过滤键盘操作的例子

    同样也是寒江独钓的例子,但只给了思路,现贴出实现代码 原理是通过改变端口驱动中本该调用类驱动回调函数的地方下手 //替换分发函数 来实现过滤 #include <wdm.h> #inclu ...

  5. LB 负载均衡的层次结构

    作为后端应用的开发者,我们经常开发.调试.测试完我们的应用并发布到生产环境,用户就可以直接访问到我们的应用了.但对于互联网应用,在你的应用和用户之间还隔着一层低调的或厚或薄的负载均衡层软件,它们不显山 ...

  6. ABP理论学习之EntityFramework集成

    返回总目录 本篇目录 Nuget包 创建DbContext 仓储 仓储基类 实现仓储 自定义仓储方法 阅读其他 ABP可以使用任何ORM框架工作,并且已经内置了EntityFramework集成.这篇 ...

  7. 使用Unity3D的设计思想实现一个简单的C#赛车游戏场景

    最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现.原本在C#中很方便地就可以完成的一个小场景,使用Unity3 ...

  8. 基于存储过程的MVC开源分页控件--LYB.NET.SPPager

    摘要 现在基于ASP.NET MVC的分页控件我想大家都不陌生了,百度一下一大箩筐.其中有不少精品,陕北吴旗娃杨涛大哥做的分页控件MVCPager(http://www.webdiyer.com/)算 ...

  9. MySQL 体系结构

    标签:MYSQL/数据库/查询原理/体系结构 概述 学习一门数据库系统首先得了解它的架构,明白它的架构原理对于后期的分析问题和性能调优都有很大的帮助,接下来就通过分析架构图来认识它. 目录 概述 架构 ...

  10. 再探.NET的PE文件结构(安全篇)

    一.开篇 首先写在前面,这篇文章源于个人的研究和探索,由于.NET有自己的反射机制,可以清楚的将源码反射出来,这样你的软件就很容易被破解,当然这篇文章不会说怎么样保护你的软件不被破解,相反是借用一个软 ...