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", ""); //省份ID
ISolrQuery q2 = new SolrQueryByField("cityid", ""); //市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 > )
Console.WriteLine("{0}: {1}", f.Key, f.Value);
}
高级查询场景二(任意分组)
上面是车源品牌,价格也一样,你想根据指定价格区间查询车源数据则就要用到任务分组。 任意分组的查询结果在返回值的FacetQueries中,遍历改keyvalue取值。
ISolrOperations<SolrQuotePriceCore> solr = ServiceLocator.Current.GetInstance<ISolrOperations<SolrQuotePriceCore>>();
ISolrQuery r1 = new SolrQueryByRange<decimal>("price", , 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", "");
ISolrQuery q2 = new SolrQueryByField("cityid", "");
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 + ;
总结
查询用到的接口和类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
SolrNet高级用法(分页、Facet查询、任意分组)的更多相关文章
- Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)
上一篇,讲到了SolrNet的基本用法及CURD,这个算是SolrNet 的入门知识介绍吧,昨天写完之后,有朋友评论说,这些感觉都被写烂了.没错,这些基本的用法,在网上百度,资料肯定一大堆,有一些写的 ...
- redis的Linux系统安装与配置、redis的api使用、高级用法之慢查询、pipline事物
今日内容概要 redis 的linux安装和配置 redis 的api使用 高级用法之慢查询 pipline事务 内容详细 1.redis 的linux安装和配置 # redis 版本选择问题 -最新 ...
- django基础之day05,F与Q查询,Q查询的高级用法
#F与Q查询 #*************************** F 查询 ******************** # F 查询数据库中的其他字段!!! #1.查询库存数大于卖出数的书籍 fr ...
- 【2017-06-02】Linq高级查询,实现分页组合查询。
1.以XXX开头 2.以XXX结尾 3.模糊查询 4.求个数 5.求最大值 6.求最小值 7.求平均值 8.求和 9.升序 10.降序 11.分页 Skip()跳过多少条 Take()取多少条 12. ...
- 8.2Solr API使用(Facet查询)
转载请出自出处:http://eksliang.iteye.com/blog/2165882 一)概述 Facet是solr的高级搜索功能之一,可以给用户提供更友好的搜索体验.在搜索关键字的同时,能够 ...
- solr facet查询及solrj 读取facet数据(相当有用)
原文出自:http://www.coin163.com/java/docs/201310/d_3010029802.html 一. Facet 简介 Facet 是 solr 的高级搜索功能之一 ...
- solr facet查询及solrj 读取facet数据[转]
solr facet查询及solrj 读取facet数据 | 所属分类:solr facet solrj 一. Facet 简介 Facet 是 solr 的高级搜索功能之一 , 可以给用户提供更 ...
- SQL[连载3]sql的一些高级用法
SQL[连载3]sql的一些高级用法 SQL 高级教程 SQL SELECT TOP SQL SELECT TOP 子句 SELECT TOP 子句用于规定要返回的记录的数目. SELECT TOP ...
- mysql的高级用法
1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...
随机推荐
- EntityFramework Core Raw SQL
前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFram ...
- 理解CSS视觉格式化
前面的话 CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...
- ASP.NET是如何在IIS下工作的
ASP.NET与IIS是紧密联系的,由于IIS6.0与IIS7.0的工作方式的不同,导致ASP.NET的工作原理也发生了相应的变化. IIS6(IIS7的经典模式)与IIS7的集成模式的不同 IIS6 ...
- .NET Core的日志[5]:利用TraceSource写日志
从微软推出第一个版本的.NET Framework的时候,就在“System.Diagnostics”命名空间中提供了Debug和Trace两个类帮助我们完成针对调试和跟踪信息的日志记录.在.NET ...
- mybatis_映射查询
一.一对一映射查询: 第一种方式(手动映射):借助resultType属性,定义专门的pojo类作为输出类型,其中该po类中封装了查询结果集中所有的字段.此方法较为简单,企业中使用普遍. <!- ...
- android 两种实现计时器时分秒的实现,把时间放在你的手中~
可能我们在开发中会时常用到计时器这玩意儿,比如在录像的时候,我们可能需要在右上角显示一个计时器.这个东西其实实现起来非常简单. 只需要用一个控件Chronometer,是的,就这么简单,我都不好意思讲 ...
- [转载]强制不使用“兼容性视图”的HTML代码
在IE8浏览器以后版本,都有一个"兼容性视图",让不少新技术无法使用.那么如何禁止浏览器自动选择"兼容性视图",强制IE以最高级别的可用模式显示内容呢?下面就介 ...
- Java实现FTP文件与文件夹的上传和下载
Java实现FTP文件与文件夹的上传和下载 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制 ...
- 递归实现n(经典的8皇后问题)皇后的问题
问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...
- Linux.NET学习手记(7)
前一篇中,我们简单的讲述了下如何在Linux.NET中部署第一个ASP.NET MVC 5.0的程序.而目前微软已经提出OWIN并致力于发展VNext,接下来系列中,我们将会向OWIN方向转战. 早在 ...