gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:48:32 25 4
gpt4 key购买 nike

只要我将查询限制为:

SolrQuery solrQuery = new SolrQuery();

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

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

当我尝试按字段“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) 中进行并且工作正常,因此这不是架构问题。

最佳答案

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

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

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;

}

关于java - Solr 3.6.1 API 中的分组 Solr 结果在解析结果时导致 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23336052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com