使用SolrJ和Solr4进行刻面

时间:2013-01-23 16:52:57

标签: java solr solrj faceted-search solr4

我已经浏览了本网站上的相关问题,但未找到相关解决方案。

使用表单

的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对象中提取构面数据?

感谢。

更新

我也尝试过类似谢尔盖的回应(见下文)。

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

上面的代码显示了大小= 1的ffList,循环经历了1次迭代。在输出ffname =&#34; country&#34;和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:

我想我得到了它,再次基于谢尔盖在下面说的话。我使用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();
    }
}

在上面的代码中,label变量匹配每个facet组,count是该分组的相应计数。

2 个答案:

答案 0 :(得分:7)

实际上你只需要设置facet字段并激活facet(检查SolrJ源代码):

solrQuery.addFacetField("country");

您在哪里寻找方面信息?它必须位于QueryResponse.getFacetFieldsgetValues.getCount

答案 1 :(得分:2)

在solr响应中,您应使用QueryResponse.getFacetFields()获取List FacetFields其中的数字&#34; country&#34;。所以&#34;国家&#34;由QueryResponse.getFacetFields().get(0)

识别

然后使用

对其进行迭代以获取ListCount个对象
QueryResponse.getFacetFields().get(0).getValues().get(i)

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

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