上一篇,讲到了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.复杂查询

     public static void Query(string keyword, int category, string color, double price, int start, DateTime? startTime, DateTime? endTime, int pageNum)
{
//定义solr
ISolrOperations<Product> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Product>>();
QueryOptions options = new QueryOptions();//创建条件集合
List<ISolrQuery> query = new List<ISolrQuery>(); if (!string.IsNullOrEmpty(keyword))
{
List<ISolrQuery> ar = new List<ISolrQuery>();
string[] keywords = keyword.Split(new char[] { ',' });
foreach (string a in keywords)
{
ar.Add(new SolrQueryByField("id", a));
}
//创建ID 条件集合的关系,是OR还是AND
var kw = new SolrMultipleCriteriaQuery(ar, "OR");
//添加至条件集合
query.Add(kw);
} if (category > )
{
// 创建分类的查询条件
var qCate = new SolrQueryByField("category", category.ToString());
//添加条件
query.Add(qCate);
} //查询颜色,多个颜色,用 ,号隔开 green,grey
if (color != "")
{
//创建颜色条件集合
List<ISolrQuery> ar = new List<ISolrQuery>();
string[] colors = color.Split(new char[] { ',' });
foreach (string a in colors)
{
ar.Add(new SolrQueryByField("color", a));
} //创建颜色查询条件的关系,是OR还是AND
var qcolor = new SolrMultipleCriteriaQuery(ar, "OR"); //添加至条件集合
query.Add(qcolor);
} //创建时间范围条件, 开始时间和结束时间
SolrQueryByRange<DateTime> qDateRange = null;
if (startTime != null && endTime != null)
{
var stime = DateTime.Parse(startTime.ToString());
var etime = DateTime.Parse(endTime.ToString()); //后两个参数,一个是开始时间,一个是结束时时间
qDateRange = new SolrQueryByRange<DateTime>("updatetime", stime, etime);
//时间范围条件加入集合
query.Add(qDateRange);
} //设定查询结果的排序,按照时间倒排序.
options.AddOrder(new SolrNet.SortOrder("updatetime", Order.DESC)); //条件集合之间的关系
var qTBO = new SolrMultipleCriteriaQuery(query, "AND"); //执行查询
SolrQueryResults<Product> results = solr.Query(qTBO, options);
       // 显示查询结果
foreach (Product p in results)
{
Console.WriteLine("id:{0} name:{1} color:{2} price:{3}", p.id, p.name, p.color, p.price);
}
Console.ReadKey();
}

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

b. ISolrQuery 查询条件,集合

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

   2.分页

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

       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 + ;

   

   3.高亮  

            QueryOptions options = new QueryOptions();
       
var high = new HighlightingParameters();
high.Fields = new List<string> { "color" };
high.BeforeTerm = "<font color='red'><b>";
high.AfterTerm = "</b></font>"; options.Highlight = high;
// 拼接其他查询条件
.
       .
       .
       //执行查询
SolrQueryResults<Product> results = solr.Query(qTBO, options);
      // 处理需要高亮的字段
var highlights = results.Highlights;
foreach (var item in results)
{
var t = highlights[item.id.ToString()].Values.ToList()[].ToList()[];
item.color = t;
} // 显示查询结果
foreach (Product p in results)
{
Console.WriteLine("id:{0} name:{1} color:{2} price:{3}", p.id, p.name, p.color, p.price);
}

   4.Facet查询

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

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

      var facet = new FacetParameters
{
Queries = new[] { new SolrFacetFieldQuery("category") }
}; options.Facet = facet; var qTBO = new SolrMultipleCriteriaQuery(query, "AND"); SolrQueryResults<Product> results = solr.Query(qTBO, options); foreach (var f in results.FacetFields["category"])
{
Console.WriteLine("{0}: {1}", f.Key, f.Value);
}

      2. 时间段分组

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

        // 时间分组
var facet = new FacetParameters
{
Queries = new[] {
new SolrFacetDateQuery(
"updatetime",
new DateTime(, , ) /* 开始时间 */,
new DateTime(,, ) /* 结束时间 */,
"+7DAY" /* 时间间隔 */)
{
HardEnd = true,
Other = new[] {FacetDateOther.After, FacetDateOther.Before}
},
}
}; options.Facet = facet; //条件集合之间的关系
var qTBO = new SolrMultipleCriteriaQuery(query, "AND"); SolrQueryResults<Product> results = solr.Query(qTBO, options); DateFacetingResult dateFacetResult = results.FacetDates["updatetime"]; foreach (KeyValuePair<DateTime, int> dr in dateFacetResult.DateResults)
{
Console.WriteLine(dr.Key);
Console.WriteLine(dr.Value);
}

      3. 任意分组

       // 按照价格段分组
var lessThan30 = new SolrQueryByRange<decimal>("price", 0m, 30m);
var lessThan70 = new SolrQueryByRange<decimal>("price", 30m, 70m);
var moreThan70 = new SolrQueryByRange<decimal>("price", 70m, 100m); var facet = new FacetParameters
{
Queries = new[] { new SolrFacetQuery(lessThan30), new SolrFacetQuery(lessThan70), new SolrFacetQuery(moreThan70) }
}; options.Facet = facet; var qTBO = new SolrMultipleCriteriaQuery(query, "AND"); SolrQueryResults<Product> results = solr.Query(qTBO, options);
foreach (var f in results.FacetQueries)
{
Console.WriteLine("{0}: {1}", f.Key, f.Value);
}

      

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

        /// <summary>
/// Facet 查询
/// </summary>
/// <param name="color"></param>
public static void Query_FactPivot()
{
ISolrOperations<Product> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Product>>();
//Create a facet Pivot Query
var facetPivotQuery = new SolrFacetPivotQuery()
{
//默认是 1 pivot, 先 category 再按 color 分组
//如果是多个,则在后面继续追加 ,new PivotFields("color", "category")
Fields = new[] { new PivotFields("color", "category")}, //最小记录数
MinCount =
}; //创建一个查询参数
//同时 pivotQueries 可以和其他查询条件一起混用
var facetParams = new FacetParameters()
{
Queries = new[] { facetPivotQuery }, Limit =
}; var queryOptions = new QueryOptions();
queryOptions.Facet = facetParams;
queryOptions.Rows = ; var results = solr.Query("*:*", queryOptions);
if (results.FacetPivots.Count > )
{
foreach (var pivotTable in results.FacetPivots)
{
Console. WriteLine("Pivot table for " + pivotTable.Key);
foreach (var pivot in pivotTable.Value)
{
Console.WriteLine(" Pivot: " + pivot.Field + " with value " + pivot.Value + ". Child Pivots:");
foreach (var pivotChild in pivot.ChildPivots)
{
Console.WriteLine(" - " + pivotChild.Value + " (" + pivotChild.Count + ")");
}
}
}
} Console.ReadKey();
}

      这个是比较精细化,也更加复杂的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. 解决bootstrap模态框内输入框无法获取焦点

    bootstrap 模态框中的input标签在某些情况下会无法获取焦点. 最终解决方法:去除模态框的 tabindex="-1" 属性即可

  2. php下载中文名文件

    $path = APPPATH . '../htdocs/download/corp/商标申请委托书模版.doc';$filename = '商标申请委托书模版.doc';header("C ...

  3. C#如何测试代码运行时间

    1.System.Diagnostics.Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); // 开始监视代码运行时间 // 需要测试 ...

  4. The Myths about Transactions (ACID) and NoSQL

    There has been widespread characterization of one of the major distinctions between NoSQL and tradit ...

  5. WPF之命令浅谈

    一.认识命令 1.1命令的特点 提到“命令”,我们应该想到命令的发出者,命令的接受者,命令的内容,准备工作,完成任务,回报工作...与事件中的发送者,接受者,消息,处理,处理,处理一一对应,如果是单纯 ...

  6. SQL Server : Browser服务

    SQL Server : Browser服务是SQL Server 2005新增的,简单的说,如果一个物理服务器上面有多个SQL Server实例,那么为了确保客户端能访问到正确的实例,所以SQL S ...

  7. 剑指Offer面试题:22.二叉搜索树的后序遍历序列

    一.题目:二叉搜索树的后序遍历序列 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如在下面 ...

  8. 使用VS+VisualGDB编译调试Linux程序

    Linux程序开发变得越来越多,越来越多的程序.产品需要跨平台,甚至有些开源项目只支持Linux平台,所以掌握Linux开发变得越来越重要. 但是对于习惯了Windows下的开发,使用了VS这个宇宙第 ...

  9. delegate、notification、KVO场景差别

    delegate: 编译器会给出没有实现代理方法的警告 一对一 使用weak而不是assign,或者vc消失时置为nil 可以传递参数,还可以接收返回值 notification: 编译期无法排错 一 ...

  10. web应用中使用JavaMail发送邮件

    现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...