1.对字段(域)为多值属性的,即multiValued="true"。
facet是可以对多值属性进行分组的,但是Group是不可以的。
2.对字段(域)为分词属性的,如下:<field name="docText" type="text_ik" multiValued="false" indexed="true" required="false" stored="true"/>
facet是可以对分词字段进行分组的,但Group是不可以的。
3.对于其他字段属性的,目前测试的string、long等,facet和group都是可以进行分组的。\
4.传入多个分组字段时,每个字段都会有一个对应的查询分组结果,即各个字段之间是平行关系,非嵌套关系。
下面给出一些代码和测试结果:
facet的测试:
public void solrFacet(String collectionName, String strCondition,
String... fields) { try { SolrQuery solrQuery = new SolrQuery(); solrQuery.set("collection", collectionName); solrQuery.setFacet(true);//控制输出分组的个数,对于有上千个分组的结果,可以控制只返回前一百个分组
solrQuery.setFacetLimit(10); solrQuery.addFacetQuery(strCondition); solrQuery.addFacetField(fields);//分组后count数小于设置的组会从结果列表中抛弃
solrQuery.setFacetMinCount(2);//默认按count降序排序,即各个分组包含的个数为count
solrQuery.setFacetSort(solrQuery.getFacetSortString()); QueryResponse solrQueryResponse=solrServer.query(solrQuery); List<FacetField> facetFields = solrQueryResponse.getFacetFields(); //返回facet列表 for (FacetField facet : facetFields) { System.out.println(facet.getName()); System.out.println("------"); List<Count> values = facet.getValues(); for (Count count : values) { System.out.println(count.getName()+"---"+count.getCount()); } } } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}
group的测试:
/**
* solr 分组查询 group by */ public void solrGroup(String strCondition, String... fields) {try {
SolrQuery solrQuery = new SolrQuery(); solrQuery.setQuery(strCondition); solrQuery.setParam("group", true);// 是否分组solrQuery.setParam("group.field", fields);// 分组的域(此处以公司id进行分组)
// solrQuery.setParam("group.query",
// "id:*");//还可以根据其他条件进行过滤,如价格在1到100之间solrQuery.setParam("group.limit", "3");// 每组显示的个数,默认为1
// solrQuery.setParam("group.ngroups",
// true);//是否计算所得分组个数;注意:当每个分组显示数目大于1个时,不能用分组数量来计算总页码// solrQuery.setStart(0); //起始索引值
// solrQuery.setRows(100);//显示几条数据
QueryResponse resp = solrServer.query(solrQuery);
GroupResponse gresp = resp.getGroupResponse();// 注意:此处不能再用resp.getResults()接收结果List<GroupCommand> commands = gresp.getValues();
if (commands != null) {
for (GroupCommand com : commands) { // System.out.println("总的分组个数:" + com.); System.out.println("values:" + com.getName()); System.out.println("分组的个数:" + com.getValues().size()); if (com.getValues().isEmpty()) { System.out.println("没有值..."); } for (Group group : com.getValues()) {SolrDocumentList hits = group.getResult();
System.out.println("涉及文档个熟:" + hits.size()); for (SolrDocument doc : hits) { System.out.println("id: " + (String) doc.getFieldValue("id") + ", rowkey: " + (String) doc.getFieldValue("rowkey") .toString() + ", docText" + doc.getFieldValue("docText") + "");}
}
}
}} catch (SolrServerException e) {
// TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }}