只要我将查询限制为:
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)中进行类似的分组(使用相同的字段)并且工作正常,因此这不是架构问题。
答案 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;
}