只要我将查询限制为:
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)中进行类似的分组(使用相同的字段)并且工作正常,因此这不是架构问题.
我解决了我的问题.如果将来有人需要这个:
执行组查询时,应使用不同的方法来获取和解析结果.在未分组的查询中
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)
| 归档时间: |
|
| 查看次数: |
1131 次 |
| 最近记录: |