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", "540000"); //省份ID
            ISolrQuery q2 = new SolrQueryByField("cityid", "542400"); //市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 > 0)
                    Console.WriteLine("{0}: {1}", f.Key, f.Value);
            }

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

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

ISolrOperations<SolrQuotePriceCore> solr = ServiceLocator.Current.GetInstance<ISolrOperations<SolrQuotePriceCore>>();

            ISolrQuery r1 = new SolrQueryByRange<decimal>("price", 0, 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", "540000");
            ISolrQuery q2 = new SolrQueryByField("cityid", "542400");
            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 + 1;   

总结

查询用到的接口和类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

时间: 2024-08-08 09:57:54

SolrNet高级用法(分页、Facet查询、任意分组)的相关文章

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

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

JAVA正则表达式高级用法(分组与捕获)

正则表达式在字符串处理中经常使用,关于正则简单的用法相信有一点程序基础的人都懂得一些,这里就不介绍简单基础了.这里主要讲解一下在JAVA中实现了的正则的高级用法-分组与捕获.对于要重复单个字符,非常简单,直接在字符后卖弄加上限定符即可,例如 a+ 表示匹配1个或一个以上的a,a?表示匹配0个或1个a.这些限定符如下所示: X ?     X ,一次或一次也没有X *     X ,零次或多次X +     X ,一次或多次X { n }     X ,恰好 n 次X { n ,}     X ,

高级查询,分组查询

分组查询定义:利用内置的分组函数来查询 所谓分组,就是看待数据的"角度"不同.  也就是把某类值相同的看做一组. 语法:select 列名,组函数(列名)...from 表名where 条件group by 列having 字句order by 列 分组函数:SUM([distinct] 列|表达式|值)   求和AVG([distinct] 列|表达式|值)   求平均值MAX(列|表达式|值)   求最大值 MIN(列|表达式|值)    求最小值COUNT([distinct]

8.2Solr API使用(Facet查询)

转载请出自出处:http://eksliang.iteye.com/blog/2165882 一)概述 Facet是solr的高级搜索功能之一,可以给用户提供更友好的搜索体验.在搜索关键字的同时,能够按照Facet的字段进行分组并统计.例如下图所示,你上淘宝,输入"电脑"进行搜索,就会出现品牌分类,价格范围等分类,这个就叫Facet. 二)Solr Facet类型 Solr提供了4种类型的Fact <lst name="facet_counts"> &l

JS Replace() 高级用法(转)

在很多项目中,我们经常需要使用JS,在页面前面对前台的某些元素做做修改,js 的replace()方法就必不可少. 经常使用"ABCABCabc".replace("A","B")的同学应该会比较清楚,改语句的最终结果是BBCABC,这种方法只能替换 第一个匹配的元素.如果替换所有呢?使用正则表达式即可: "ABCABCabc".replace(/A/g,"B") 即可. 那如果想替换A的同时也可以替换a呢

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

1. 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画进行了很大幅度的改进,之前补间动画可以做到的属性动画也能做到,补间动画做不到的现在属性动画也可以做到了.因此,今天我们就来学习一下属性动画的高级用法,看看如何实现一些补间动画所无法实现的功能. 2. ValueAnimator的高级用法: 在上篇文章中介绍补间动画缺点的时候有提到过,补间动画是只能对

Mybatis最入门---ResultMaps高级用法(上)

[一步是咫尺,一步即天涯] 接上文,我们基本的单表查询使用上文中的方式已经能够达到目的.但是,我们日常的业务中也存在着多表关联查询,结果是复杂的数据集合等等.本文我们就来介绍ResultMaps的高级用法,本文,我们先介绍基本的概念,具体用法实例在下一篇中专门演示给大家.敬请期待! ------------------------------------------------------------------------------------------------------------

一步一步跟我学习lucene(16)---lucene搜索之facet查询查询示例(2)

本篇是接一步一步跟我学习lucene(14)---lucene搜索之facet索引原理和facet查询实例(http://blog.csdn.net/wuyinggui10000/article/details/45973769),上篇主要是统计facet的dim和每个种类对应的数量,个人感觉这个跟lucene的group不同的在于facet的存储类似于hash(key-field-value)形式的,而group则是单一的map(key-value)形式的,虽然都可以统计某一品类的数量,显然f

iOS自动布局高级用法及纯手码约束写法

本文主要介绍几个我遇到的总结的高级用法(当然我相信肯定有不少比这还高级的). 简单的storyboard中上下左右约束,固定宽高啥的用法在这里就不做赘述了. autolayout自动布局是iOS6以后出现的,但是在开始的一段时间里大家并不怎么会用,都是一上来先勾掉.之后随着5s,iPhone6的出现屏幕多种多样.用多层if来判断尺寸已经完全hold不住了才开始学习自动布局. 在这之前有个叫自动伸缩的autoresizing属性,这个主要用于一个控件和自己父控件之间的关系.只有autolayout