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

ex3*_*x3v 1 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);
Run Code Online (Sandbox Code Playgroud)

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

当我尝试通过我的字段"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);
Run Code Online (Sandbox Code Playgroud)

使用此结果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;

}
Run Code Online (Sandbox Code Playgroud)

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

ex3*_*x3v 5

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

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

QueryResponse response = this.solr.query(query); //(this.solr is handle to HttpSolrSelver)
SolrDocumentList list = response.getResults();
Run Code Online (Sandbox Code Playgroud)

将要工作,当你想查询组时,它不会.

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

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

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);
Run Code Online (Sandbox Code Playgroud)

最后四行定义的Solr应该分组结果和分组参数.在这种情况下,group.limit将定义您想要的组中最多的最大结果数,rows并将告诉您应该有多少最大结果.

进行分组查询如下所示:

List<GroupCommand> groupCommands = this.solr.query(query).getGroupResponse().getValues();
Run Code Online (Sandbox Code Playgroud)

在引用文档时,GroupCommand包含有关分组以及结果列表的信息,除以组.

好的,我想得到结果.怎么做?

好吧,在我的例子中,只有一个位置List<GroupCommand> groupCommands,所以要获得其中找到的组列表:

GroupCommand groupCommand = groupCommands.get(0);

List<Group> groups = groupCommand.getValues();
Run Code Online (Sandbox Code Playgroud)

这将导致组列表.每个组都包含自己的组SolrDocumentList.为拿到它,为实现它:

for(Group g : groups){
    SolrDocumentList groupList = g.getResult();
    (...)
}
Run Code Online (Sandbox Code Playgroud)

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

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

这是我的情况.这看起来很简单,但如果您正在重构已经运行的使用getNumFound()from的代码,那么有一个棘手的部分可以抓住您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;

}
Run Code Online (Sandbox Code Playgroud)