上一篇,讲到了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. backbone新手填坑教程资源

    backbone 入门第二版 http://www.kancloud.cn/kancloud/backbonejs-learning-note/49379 backbone 入门讲解 http://w ...

  2. SQL Server复制出错文章集锦

    SQL Server复制出错文章集锦 为了方便大家对数据库复制过程中出错的时候更好地解决问题 本人收集了SQL Server相关复制出错解决的文章   The process could not ex ...

  3. 开放式管理基础结构 OMI

    Windows 长久以来在 CIM 实施领域一直傲立桥头,而这一切都是从 WMI(Windows 管理基础结构)开始的.分布式管理任务组 (DMTF) 通用信息模型 (CIM) 是一种开放式标准,用于 ...

  4. 你的应用是如何被替换的,App劫持病毒剖析

    一.App劫持病毒介绍 App劫持是指执行流程被重定向,又可分为Activity劫持.安装劫持.流量劫持.函数执行劫持等.本文将对近期利用Acticity劫持和安装劫持的病毒进行分析. 二.Activ ...

  5. Linux 挂载管理(mount)

    标签:mount,umount 概述 在上一章增加linux操作系统空间中已经使用过了mount命令对分区进行挂载,这一章详细介绍挂载管理,该命令涉及的知识点也挺多的而且也还比较重要,是需要掌握的一个 ...

  6. Oracle没有WM_CONCAT函数的解决办法

    WM_CONCAT是oracle的非公开函数,并不鼓励使用,新版本oracle并没有带此函数,需要手工加上. 1.下载三个文件:owmctab.plb  . owmaggrs.plb . owmagg ...

  7. WCF 安全性之 自定义用户名密码验证

    案例下载 http://download.csdn.net/detail/woxpp/4113172 客户端调用代码 通过代理类 代理生成 参见 http://www.cnblogs.com/woxp ...

  8. iOS-App上架流程

    前言:作为一名IOS开发者,把开发出来的App上传到App Store是必须的.下面就来详细介绍下具体流程. 1.打开苹果开发者中心:https://developer.apple.com 打开后点击 ...

  9. 1代 angularjs ember vue 比较

    angularjs ember vue 比较 看了别人的ppt,直接贴结果,仅供参考

  10. KnockoutJS 3.X API 第七章 其他技术(7) 微任务

    注意:本文档适用于Knockout 3.4.0及更高版本. Knockout的微任务队列 Knockout的微任务队列支持调度任务尽可能快地运行,同时仍然是异步的,努力安排它们在发生I / O,回流或 ...