6

我已经浏览了这个网站上的相关问题,但没有找到相关的解决方案。

使用表单的 HTTP 请求查询我的 Solr4 索引时

&facet=true&facet.field=country

响应包含所有不同的国家以及每个国家的计数。

如何使用 SolrJ 获取此信息?我尝试了以下方法,但它只返回所有国家的总计数,而不是每个国家:

solrQuery.setFacet(true);
solrQuery.addFacetField("country");

以下似乎确实有效,但我不想事先明确设置所有分组:

solrQuery.addFacetQuery("country:usa");
solrQuery.addFacetQuery("country:canada");

其次,我不确定如何从 QueryResponse 对象中提取方面数据。

所以两个问题:

1) 使用 SolrJ 如何在字段上分面并返回分组而不明确指定组?

2) 使用 SolrJ 如何从 QueryResponse 对象中提取分面数据?

谢谢。

更新:

我还尝试了类似于 Sergey 的回应(如下)的东西。

List<FacetField> ffList = resp.getFacetFields();
log.info("size of ffList:" + ffList.size());
for(FacetField ff : ffList){
    String ffname = ff.getName();
    int ffcount = ff.getValueCount();
    log.info("ffname:" + ffname + "|ffcount:" + ffcount);           
}

上面的代码显示了 size=1 的 ffList 并且循环经历了 1 次迭代。在输出中 ffname="country" 和 ffcount 是匹配原始查询的总行数。

这里没有按国家/地区细分。

我应该提到,在同一个 solrQuery 对象上,我还调用了 addField 和 addFilterQuery。不确定这是否会影响刻面:

solrQuery.addField("user-name");
solrQuery.addField("user-bio");
solrQuery.addField("country");
solrQuery.addFilterQuery("user-bio:" + "(Apple OR Google OR Facebook)");

更新 2:

我想我明白了,再次基于 Sergey 在下面所说的话。我使用 FacetField.getValues() 提取了 List 对象。

List<FacetField> fflist = resp.getFacetFields();
for(FacetField ff : fflist){
    String ffname = ff.getName();
    int ffcount = ff.getValueCount();
    List<Count> counts = ff.getValues();
    for(Count c : counts){
        String facetLabel = c.getName();
        long facetCount = c.getCount();
    }
}

在上面的代码中,标签变量匹配每个方面组,计数是该分组的相应计数。

4

2 回答 2

7

实际上你只需要设置 facet 字段,facet 就会被激活(查看 SolrJ 源代码):

solrQuery.addFacetField("country");

你在哪里找的方面信息?必须在QueryResponse.getFacetFields( getValues.getCount)

于 2013-01-23T17:09:34.923 回答
2

在 solr Response 中,您应该使用其中的数字“国家”QueryResponse.getFacetFields()来获取ListFacetFields所以“国家”由QueryResponse.getFacetFields().get(0)

你迭代然后使用它来List获取Count对象

QueryResponse.getFacetFields().get(0).getValues().get(i)

并使用获取刻面的值名称和使用QueryResponse.getFacetFields().get(0).getValues().get(i).getName() 相应的权重

QueryResponse.getFacetFields().get(0).getValues().get(i).getCount()
于 2014-12-18T14:44:53.343 回答