前言

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

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

2、数据量大的要分页。

3、自定义价格区间。

4、时间段分组。

5、高亮。

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

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

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

  1. ISolrOperations<SolrQuotePriceCore> solr = ServiceLocator.Current.GetInstance<ISolrOperations<SolrQuotePriceCore>>();
  2.  
  3. //查找城市
  4. ISolrQuery q1 = new SolrQueryByField("provid", ""); //省份ID
  5. ISolrQuery q2 = new SolrQueryByField("cityid", ""); //市ID
  6. ISolrQuery q3 = new SolrQueryByField("selled", "1"); //在售状态
  7.  
  8. IList<ISolrQuery> filter=new List<ISolrQuery>();
  9. filter.Add(q1);
  10. filter.Add(q2);
  11. filter.Add(q3);
  12. //分组
  13. var facet = new FacetParameters()
  14. {
  15. Queries = new[]
  16. {
  17. new SolrFacetFieldQuery("brandid"),
  18. }
  19. };
  20.  
  21. QueryOptions options=new QueryOptions();
  22. options.Facet = facet;
  23.  
  24. SolrMultipleCriteriaQuery qtbo = new SolrMultipleCriteriaQuery(filter,"AND");
  25.  
  26. SolrQueryResults<SolrQuotePriceCore> results = solr.Query(qtbo,options);
  27.  
  28. foreach (var f in results.FacetFields["brandId"])
  29. {
  30. if (f.Value > )
  31. Console.WriteLine("{0}: {1}", f.Key, f.Value);
  32. }

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

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

  1. ISolrOperations<SolrQuotePriceCore> solr = ServiceLocator.Current.GetInstance<ISolrOperations<SolrQuotePriceCore>>();
  2.  
  3. ISolrQuery r1 = new SolrQueryByRange<decimal>("price", , 3m);
  4. ISolrQuery r2 = new SolrQueryByRange<decimal>("price", 3.01m, 5m);
  5. ISolrQuery r3 = new SolrQueryByRange<decimal>("price", 5.01m, 8m);
  6. ISolrQuery r4 = new SolrQueryByRange<decimal>("price", 8.01m, 10m);
  7. ISolrQuery r5 = new SolrQueryByRange<decimal>("price", 10.01m, 15m);
  8. ISolrQuery r6 = new SolrQueryByRange<decimal>("price", 15.01m, 20m);
  9. ISolrQuery r7 = new SolrQueryByRange<decimal>("price", 20.01m, 30m);
  10. ISolrQuery r8 = new SolrQueryByRange<decimal>("price", 30.01m, 50m);
  11. ISolrQuery r9 = new SolrQueryByRange<decimal>("price", 50.01m, 1000m);
  12.  
  13. var facet = new FacetParameters()
  14. {
  15. Queries = new[]
  16. {
  17. new SolrFacetQuery(r1),
  18. new SolrFacetQuery(r2),
  19. new SolrFacetQuery(r3),
  20. new SolrFacetQuery(r4),
  21. new SolrFacetQuery(r5),
  22. new SolrFacetQuery(r6),
  23. new SolrFacetQuery(r7),
  24. new SolrFacetQuery(r8),
  25. new SolrFacetQuery(r9)
  26. }
  27. };
  28.  
  29. ISolrQuery q1 = new SolrQueryByField("provid", "");
  30. ISolrQuery q2 = new SolrQueryByField("cityid", "");
  31. ISolrQuery q3 = new SolrQueryByField("selled", "1");
  32.  
  33. IList<ISolrQuery> filter = new List<ISolrQuery>();
  34. filter.Add(q1);
  35. filter.Add(q2);
  36. filter.Add(q3);
  37.  
  38. QueryOptions options=new QueryOptions();
  39. options.Facet = facet;
  40.  
  41. var qTBO = new SolrMultipleCriteriaQuery(filter, "AND");
  42. SolrQueryResults<SolrQuotePriceCore> results = solr.Query(qTBO, options);
  43.  
  44. foreach (var f in results.FacetQueries)
  45. {
  46. Console.WriteLine("{0}: {1}", f.Key, f.Value);
  47. }

高级查询场景三(分页)

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

总结

查询用到的接口和类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查询、任意分组)的更多相关文章

  1. Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)

    上一篇,讲到了SolrNet的基本用法及CURD,这个算是SolrNet 的入门知识介绍吧,昨天写完之后,有朋友评论说,这些感觉都被写烂了.没错,这些基本的用法,在网上百度,资料肯定一大堆,有一些写的 ...

  2. redis的Linux系统安装与配置、redis的api使用、高级用法之慢查询、pipline事物

    今日内容概要 redis 的linux安装和配置 redis 的api使用 高级用法之慢查询 pipline事务 内容详细 1.redis 的linux安装和配置 # redis 版本选择问题 -最新 ...

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

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

  4. 【2017-06-02】Linq高级查询,实现分页组合查询。

    1.以XXX开头 2.以XXX结尾 3.模糊查询 4.求个数 5.求最大值 6.求最小值 7.求平均值 8.求和 9.升序 10.降序 11.分页 Skip()跳过多少条 Take()取多少条 12. ...

  5. 8.2Solr API使用(Facet查询)

    转载请出自出处:http://eksliang.iteye.com/blog/2165882 一)概述 Facet是solr的高级搜索功能之一,可以给用户提供更友好的搜索体验.在搜索关键字的同时,能够 ...

  6. solr facet查询及solrj 读取facet数据(相当有用)

    原文出自:http://www.coin163.com/java/docs/201310/d_3010029802.html 一.   Facet 简介 Facet 是 solr 的高级搜索功能之一  ...

  7. solr facet查询及solrj 读取facet数据[转]

    solr facet查询及solrj 读取facet数据 | 所属分类:solr facet solrj 一.   Facet 简介 Facet 是 solr 的高级搜索功能之一 , 可以给用户提供更 ...

  8. SQL[连载3]sql的一些高级用法

    SQL[连载3]sql的一些高级用法 SQL 高级教程 SQL SELECT TOP SQL SELECT TOP 子句 SELECT TOP 子句用于规定要返回的记录的数目. SELECT TOP ...

  9. mysql的高级用法

    1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...

随机推荐

  1. “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)

    前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...

  2. excel 日期/数字格式不生效需要但双击才会生效的解决办法

    原因: Excel2007设置过单元格格式后,并不能立即生效必须挨个双击单元格,才能生效.数据行很多.效率太低. 原因:主要是一些从网上拷贝过来的日期或数字excel默认为文本格式或特殊-中文数字格式 ...

  3. 快速搭建springmvc+spring data jpa工程

    一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...

  4. WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体

    最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件所以在提交信息的时候需要自己手动的去Request.QueryString[] ...

  5. MVC通过路由实现URL重写

    public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Ro ...

  6. 集合(set)-Python3

    set 的 remove() 和 discard()  方法介绍. 函数/方法名   等价操作符 说明 所有集合类型 len(s)   集合基数:集合s中元素个数 set([obj])   可变集合工 ...

  7. .net core和angular2之前端篇—1

    2016-10-20更新 今天的这篇文章还是一篇"Hello World",只不过开发环境有所改变--Visual Studio Code+Angular2+Webapck,也算是 ...

  8. NPM如何更新到最新版

    参考文章--npm更新到最新版本的方法 其实我们可以这样,随便新建一个文件夹例如:F:\test.按着"shift"键,右键该文件夹,选择"在此处打开命令窗口(W)&qu ...

  9. AFNetworking图片上传

    //上传图片 -(void)upLoadImage:(UIImage *)upImage { //创建管理 AFHTTPRequestOperationManager *manager = [AFHT ...

  10. centos 6 安装配置openvpn

    下载地址:http://swupdate.openvpn.org/community/releases/http://www.oberhumer.com/opensource/lzo/download ...