solr facet 和 group的区别

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();
		}
		
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值