solr group分组排序的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了solr group分组排序的问题相关的知识,希望对你有一定的参考价值。

我想查询一组数据,这个数据需要分组,我想让分组后的数据按照分组数量升序或者降序排列,如果按照结果中的组数量进行排序呢,
// ------------ 分组设置
//q=solr+memory&group=true&group.field=manu_exact
params.setParam(GroupParams.GROUP,true);
params.setParam(GroupParams.GROUP_FIELD,"alias");//这里是分组

params.setParam(GroupParams.GROUP_SORT, "id desc");//现在排序好像只能按照已有的字段进行排序,如果按照组数量进行排序呢?

排序该怎么写

QueryResponse response = solr.query(params);
GroupResponse groups = response.getGroupResponse();

参考技术A public static Map queryByGroup(String qStr,String groupField,String sortField,boolean asc,Integer pageSize,Integer pageNum)
Map rmap = new LinkedHashMap();
try
SolrServer server = getSolrServer();//getSolrServer() 方法就是返回一个CommonsHttpSolrServer
SolrQuery query = new SolrQuery();
if(qStr!=null&&qStr.length()>0)
query.setQuery(qStr);
else
query.setQuery("*:*");//如果没有查询语句,必须这么写,否则会报异常
query.setIncludeScore(false);//是否按每组数量高低排序
query.setFacet(true);//是否分组查询
query.setRows(0);//设置返回结果条数,如果你时分组查询,你就设置为0
query.addFacetField(groupField);//增加分组字段
query.setFacetSort(true);//分组是否排序
query.setFacetLimit(pageSize);//限制每次返回结果数
query.setSortField(sortField,asc SolrQuery.ORDER.asc :SolrQuery.ORDER.desc );//分组排序字段
query.set(FacetParams.FACET_OFFSET,(pageNum-1)*pageSize);//当前结果起始位置
QueryResponse rsp = server.query( query );
List countList = rsp.getFacetField(groupField).getValues();
List returnList = new ArrayList();
if(pageNum*pageSize0)
rmap.put(count.getName(),(int) count.getCount());

catch (Exception e)
e.printStackTrace();

return rmap;
追问

这个里面好像没有我要的答案

参考技术B 没看懂什么意思?

Solr聚合查询

1  分组查询

概述:Solr常用的分组查询有两种,Facet分组和Group分组,分别以下列出这两种查询:
 

1.1     Facet分组

solr种以导航为目的的查询结果成为facet,在用户查询的结果上根据分类增加了count信息,然后用户根据count信息做进一步搜索,

 Facet是solr的高级搜索功能之一,可以给用户提供更友好的搜索体验.在搜索关键字的同时,能够按照Facet的字段进行分组并统计。

 

Solr Fact提供了4种类型的Fact

 

  1.  
    <lstname="facet_counts">
  2.  
    <lstname="facet_queries"/>
  3.  
    <lstname="facet_fields"/>
  4.  
    <lstname="facet_dates"/>
  5.  
    <lstname="facet_ranges"/>
  6.  
    </lst>
  7.  
    facet_queries:代表自定义条件查询facet,类似数据库的count函数
  8.  
    facet_fields :代表根据字段分组查询,类似数据库的groupby count的组合
  9.  
    facet_dates:根据日期区间分组查询
  10.  
    facet_ranges:当然了,日期有区间,数字也有,这个就是根据数字分组查询

 

 

 

说明:

facet的基本功能就是对搜索结果中的数据进行分类。

facet用法

 

  1.  
    facet.field:指定要分类的字段
  2.  
    facet=on 或 facet=true表示功能开启
  3.  
    facet.prefix 表示字段前缀
  4.  
    facet.limit 表示返回的记录数
  5.  
    facet.offict 表示从第几条开始,主要用于分页
  6.  
    facet.query可以任意定义查询

 

Range Facet

一般用于date类型或数字类型的字段。

 

  1.  
    &facet=on
  2.  
    &facet.query=date:[2009-1-1T0:0:0ZTO 2010-1-1T0:0:0Z]

 

 

参数说明

 

  1.  
    facet.range 需要做facet查询的字段
  2.  
    facet.range.start 设置起始点
  3.  
    facet.range.end 设置终止点
  4.  
    facet.range.gap 限定每一段范围的区间差值
  5.  
    facet.range.hardend 指定如何处理最后一个区间
  6.  
    facet.range.include 指定如何处理临界值
  7.  
    facet.range.other 指定如何处理限定范围以为的结果
  8.  
    facet.range.method 指定facet算法

 

如下查询:

 

http://localhost:8983/solr/solr_select/query?q=*:*&facet=on&facet.field=name

 

根据name字段分组查询结果

技术分享图片

 

 

 

1.2     Group分组

Solr对结果的分组处理除了facet还可以使用group。Solr的group是根据某一字段对结果分组,将每一组内满足查询的结果按顺序返回。

Group对比Facet

Group和Facet的概念很像,都是用来分组。Facet返回所有相关的结果并允许用户基于facet的目录重新定义结果集。Facet可以对分组数量进行过滤,以及排序,和日期范围,时间范围分组,但是如果你想得到具体的数据,还得需要查询一次或多次。group可以得到分组的组数量,一次请求,可以拿到所有的数据。

Group和Facet可以结合起来使用,但只能使用facet.field和facet.range,还不支持日期date和维度统计pivot faceting.

如下查询:

 

http://localhost:8983/solr/solr_select/query?q=*:*&group=true&group.field=name

技术分享图片

 

 

 

参数说明:

 

参数类型说明
group 布尔值 设为true,表示结果需要分组
group.field 字符串 需要分组的字段,字段类型需要时是StrField或TextField
group.func 查询语句 可以指定查询函数
group.query 查询语句 可以指定查询语句
rows 整数 返回多少组结果,默认10
start 整数 指定结果开始位置/偏移量
group.limit 整数 每组返回多数条结果,默认1
group.offset 整数 指定每组结果开始位置/偏移量
sort 排序算法 控制各个组的返回顺序
group.sort 排序算法 控制每一分组内部的顺序
group.format grouped/simple 设置为simple可以使得结果以单一列表形式返回
group.main 布尔值 设为true时,结果将主要由第一个字段的分组命令决定
group.ngroups 布尔值 设为true时,Solr将返回分组数量,默认fasle
group.truncate 布尔值 设为true时,facet数量将基于group分组中匹相关性高的文档,默认fasle
group.cache.percent 整数0-100 设为大于0时,表示缓存结果,默认为0。该项对于布尔查询,通配符查询,模糊查询有改善,却会减慢普通词查询。

 

 

 

2      Stats Component聚合查询

摘要: Solr可以利用StatsComponent实现对数字、字符串或日期字段的聚合统计查询即:minmaxavgcountsum的功能

 

Stats Component参数说明:

 

参数描述
stats 布尔值,设为true,表示开启Stats Component
stats.field 指定需要做统计的字段
stats.facet 对指定的facet生成一个子结果集
stats.calcdistinct 布尔值,将会返回”countDistinct”和”distinctValues”,其代价很高。默认fasle

 

stats Component统计内容

 

统计项目描述支持的类型是否默认输出
min 最小值 所有
max 最大值 所有
sum 数字、日期
count 个数 所有
missing 空值的个数 所有
sumOfSquares 平方和 数字、日期
mean 均值 数字、日期  
stddev 标准差 数字、日期
percentiles 精度/小数点后几位 数字
distinctValues set/不重复值集合 所有
countDistinct set精确个数/不重复值集合大小,使用代价很大 所有
cardinality set个数/不重复值集合大小,可能不准确 所有

 

如下查询:

http://localhost:8983/solr/solr_select/select?q=*:*&stats=true&stats.field=id&rows=0&indent=true

技术分享图片

以上是关于solr group分组排序的问题的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL05_ORDR BY排序LIMIT分组GROUP BY分组

SQL中的group by为啥是按照分组的第二个字段排序的呢?

对分组报告进行排序

LINQ之路14:LINQ Operators之排序和分组(Ordering and Grouping)

MySQL进阶5--分组排序和分组查询 group by(having) /order by

分组可排序天时从 group_concat 中选择第一行和最后一行