solr group分组查询

应用场景:

solr作为一个数据存放的仓库,方便我们快速查找。当一个实例core和另一个实例core有某一个关联关系,就跟我们的库表一样,有一个字段表示了两张表有关联。

group 就可以解决这样的查询,并且返回主表的一些属性。

代码如下:

//group方式统计

public static List<Map<String,Object>> searchGroup() {

    List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>();

    SolrClient client = getSolrClient();

    SolrQuery query = new SolrQuery();

    try {

        String[] orderParam = new String[]{"solrField_relationId"};

        query.setParam("group", true);

query.setParam("group.field", orderParam);  

query.setParam("group.limit", "1");

query.setParam("group.offset", "0");

query.setParam("group.ngroups", true);

query.set("q", "solrField_s_400cf9863525446ab637e1c47c9af199:*杨*");

query.setStart(0);

query.setRows(10);

QueryResponse response = client.query(query);

if (response != null) {  

    GroupResponse groupResponse = response.getGroupResponse();

    if(groupResponse != null) {      

List<GroupCommand> groupList = groupResponse.getValues();

for(GroupCommand groupCommand : groupList) {   

   List<Group> groups = groupCommand.getValues();

   System.out.println("总个数:"+groupCommand.getNGroups().longValue());

   for (int i = 0; i < groups.size(); i++) {

      Map<String,Object> map = new HashMap<String,Object>();

      SolrDocument solrDocument = groups.get(i).getResult().get(0);

      map.put("id", solrDocument.get("id"));    

                      map.put("solrField_relationId", solrDocument.get("solrField_relationId"));

 map.put("solrField_s_400cf9863525446ab637e1c47c9af199", solrDocument.get("solrField_s_400cf9863525446ab637e1c47c9af199"));


map.put("solrField_s_3053005c93bd43f0817dd1d24ffb339a", solrDocument.get("solrField_s_3053005c93bd43f0817dd1d24ffb339a"));

    resultList.add(map);

}

    }

}

}

}catch(Exception ex) {

ex.printStackTrace();

}

    return resultList;

    }

// 查询方法

List<Map<String,Object>> list = searchGroup();

for (Iterator iterator = list.iterator(); iterator.hasNext();) {

    Map<String, Object> map = (Map<String, Object>) iterator.next();

    System.out.println(map);

}

参数讲解

query.setParam("group"true);                表示启用group查询

query.setParam("group.field"orderParam);    关联关系

query.setParam("group.limit""1");           limit和offset是控制偏移值的,因为主表的一条数据对应多条从表的数据

query.setParam("group.offset""0");

query.setParam("group.ngroups"true);        

这个和打印总条数有关系,如果不开启, System.out.println("总个数:"+groupCommand.getNGroups().longValue());这行代码会报错

query.set("q""solrField_s_400cf9863525446ab637e1c47c9af199:*杨*"); 模糊匹配的条件

query.setStart(0);                            分页的其实值

query.setRows(10);                            每页的条数


打印结果:

总个数:3034

{solrField_relationId=708988, solrField_s_400cf9863525446ab637e1c47c9af199=杨传华, id=23901, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}

{solrField_relationId=711518, solrField_s_400cf9863525446ab637e1c47c9af199=杨先生, id=24280, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}

{solrField_relationId=711805, solrField_s_400cf9863525446ab637e1c47c9af199=杨潇, id=24316, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}

{solrField_relationId=712140, solrField_s_400cf9863525446ab637e1c47c9af199=谭杨, id=24346, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}

{solrField_relationId=678355, solrField_s_400cf9863525446ab637e1c47c9af199=杨启超, id=19831, solrField_s_3053005c93bd43f0817dd1d24ffb339a=女}

{solrField_relationId=678531, solrField_s_400cf9863525446ab637e1c47c9af199=杨广华, id=19857, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}

{solrField_relationId=679025, solrField_s_400cf9863525446ab637e1c47c9af199=杨冰, id=20061, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}

{solrField_relationId=679640, solrField_s_400cf9863525446ab637e1c47c9af199=杨小锁, id=20006, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}

{solrField_relationId=679678, solrField_s_400cf9863525446ab637e1c47c9af199=肖杨, id=20011, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}

{solrField_relationId=680127, solrField_s_400cf9863525446ab637e1c47c9af199=杨春生, id=20079, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}



总结:里面有一段代码很重要,就是把查询的结果转成SolrDocument solrDocument = groups.get(i).getResult().get(0);

只有把结果转成了SolrDocument,其他的相信大家都很好处理了



猜你喜欢

转载自blog.csdn.net/meix505/article/details/80167187