在解析结果时,Solr 3.6.1 API中的Solr结果分组会导致NullPointerException

时间:2014-04-28 08:25:21

标签: java solr

只要我将查询限制为:

SolrQuery solrQuery = new SolrQuery();

solrQuery.set("q", query); //where query is solr query string (e.g. *:*)
solrQuery.set("start", 0);
solrQuery.set("rows", 10);

一切正常 - 返回结果等等。

当我尝试按照我的字段对#34; Token_group"避免重复:

SolrQuery solrQuery = new SolrQuery();

solrQuery.set("q", query); //where query is solr query string (e.g. *:*)
solrQuery.set("start", 0);
solrQuery.set("rows", 10);

solrQuery.set("group", true);
solrQuery.set("group.field", "token_group");
solrQuery.set("group.ngroups", true);
solrQuery.set("group.limit", 20);

使用此结果HttpSolrServer不会抛出任何异常,但尝试访问结果会在NPE中结束。

我的查询Solr方法:

public SolrDocumentList query(SolrQuery query) throws SolrServerException {

    QueryResponse response = this.solr.query(query); //(this.solr is handle to HttpSolrSelver)
    SolrDocumentList list = response.getResults();

    return list;

}

请注意,在我们的其他应用程序(PHP)中进行类似的分组(使用相同的字段)并且工作正常,因此这不是架构问题。

1 个答案:

答案 0 :(得分:5)

我解决了我的问题。如果将来有人需要这个:

执行组查询时,应使用不同的方法来获取和解析结果。 在未分组的查询中

QueryResponse response = this.solr.query(query); //(this.solr is handle to HttpSolrSelver)
SolrDocumentList list = response.getResults();

将起作用,当您想要查询群组时,它不会。

那么,我如何制作和解析查询?

下面的建筑查询代码非常好:

SolrQuery solrQuery = new SolrQuery();

solrQuery.set("q", query); //where query is solr query string (e.g. *:*)
solrQuery.set("start", 0);
solrQuery.set("rows", 10);

solrQuery.set("group", true);
solrQuery.set("group.field", "token_group");
solrQuery.set("group.ngroups", true);
solrQuery.set("group.limit", 20);

其中最后四行定义Solr应该对结果和分组参数进行分组。在这种情况下,group.limit将定义您想要的群组中的最大结果数量,而rows将告知应该有多少最大结果。

进行分组查询如下所示:

List<GroupCommand> groupCommands = this.solr.query(query).getGroupResponse().getValues();

引用 documentation ,GroupCommand包含有关分组以及结果列表的信息,除以组。

好的,我想了解结果。怎么做?

嗯,在我的示例中,List<GroupCommand> groupCommands中只有一个位置,因此要获取其中找到的群组列表:

GroupCommand groupCommand = groupCommands.get(0);

List<Group> groups = groupCommand.getValues();

这将导致组列表。每个组都包含自己的SolrDocumentList。得到它:

for(Group g : groups){
    SolrDocumentList groupList = g.getResult();
    (...)
}

有了这个,只需为每个小组继续SolrDocumentList

我使用分组查询来获取不同结果的列表。怎么做?

这是我的理由。这看起来很简单,但是如果您重构已经运行的使用getNumFound() SolrDocumentList的代码,那么可以抓住您。

只需分析我的代码:

/**
 * Gets distinct resultlist from grouped query
 * 
 * @param query
 * @return results list
 * @throws SolrServerException 
 */
public SolrDocumentList queryGrouped(SolrQuery query) throws SolrServerException {


    List<GroupCommand> groupCommands = this.solr.query(query).getGroupResponse().getValues();

    GroupCommand groupCommand = groupCommands.get(0);

    List<Group> groups = groupCommand.getValues();

    SolrDocumentList list = new SolrDocumentList();

    if(groups.size() > 0){

        long totalNumFound = groupCommand.getNGroups();

        int iteratorLimit = 1;

        for(Group g : groups){
            SolrDocumentList groupList = g.getResult();

            list.add(groupList.get(0));   

            //I wanted to limit list to 10 records    
            if(iteratorLimit++ > 10){
                break;
            }
        }

        list.setNumFound(totalNumFound);


    }

    return list;

}