Facet和Group都是solr对结果的分组处理。但是又有一些区别。
一:Facet
推荐看这个:http://www.coin163.com/java/docs/201310/d_3010029802.html
facet的查询结果主要是分组信息,分组字段,该字段分成多少组,每组里面有多少记录。但是记录中的具体信息不知道。
Facet返回所有相关的结果并允许用户基于facet的目录重新定义结果集。Facet可以对分组数量进行过滤,以及排序,和日期范围,时间范围分组,但是如果你想得到具体的数据,还得需要查询一次或多次。
FacetField是分组的字段,如:FacetField是“书籍类型”,那么分组(“书籍类型”)可以分为:计算机、物理、数学、文学....(如果FacetLimit是4,就只显示其中4个分组),
显示的结果是:分组的名称facet.getName()和对应分组的数量facet.getCount()。
FacetField可以有多个,“书籍类型”,“价格范围”.... 按照不同字段,每个字段里有多个分组,该分组里的数量
(但是看不到书籍的作者,价格,出版社等信息)
如:书籍类型 -- 计算机 -- 99
书籍类型 -- 物理 -- 119
....
/**
* facet功能是solr高级搜索的功能
* 根据某个字段分组,然后算出这个字段各个类型的数量
*/
@Test
public void testSolrFacet(){
String URL = "http://localhost:8087/solr/core1";
HttpSolrClient server = new HttpSolrClient(URL); //连接到服务
SolrQuery query = new SolrQuery("*:*");//查询的字段等
query.setFacet(true);
query.addFacetField("bm","zz"); //根据这两个字段的记录分组
query.setFacetLimit(3);//字段的分组数量
try {
QueryResponse response = server.query(query);
List<FacetField> facets = response.getFacetFields();//使用facet的字段的集合:bm,zz
for(FacetField facet:facets){ //遍历字段的集合
System.out.println("---"+facet.getName()+"---");
List<Count> counts = facet.getValues();
for(Count count:counts){
System.out.println(count.getName() + ":" + count.getCount());//getCount()是该类别的数量
}
}
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
二、Group
Gruop也是用来对结果分组的。它可以得到分组的所有数据,包括分组的记录数量、记录的具体的信息。
@Test
public void testSolrGroup(){
String URL = "http://localhost:8087/solr/core1";
HttpSolrClient server = new HttpSolrClient(URL); //连接到服务
SolrQuery query = new SolrQuery("*:*");//查询的字段等
query.set(GroupParams.GROUP, true);
query.set(GroupParams.GROUP_FIELD, "bm","zz");
query.set(GroupParams.GROUP_LIMIT, 1);
try {
QueryResponse response = server.query(query);
GroupResponse gp = response.getGroupResponse();
List<GroupCommand> commands = gp.getValues();
for(GroupCommand c : commands){
System.out.println("---"+ c.getName()+"---"); //两个不同的字段
List<Group> gs = c.getValues();
//遍历每个字段的结果
for(Group group : gs){
//每个字段里面的分组的信息,如:计算机:{numFound=99,start=0,docs=[...]}
//docs是具体的每条记录的信息(SolrDocument),可以看到书籍的所有信息,docs显示的记录数,由GROUP_LIMIT决定
System.out.println(group.getGroupValue()+":"+group.getResult());
}
}
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}