You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solr 8.9.0环境下SolrJ如何设置多个group.query实现多分组查询

运行环境
  • Solr版本:solr-8.9.0
预期查询效果

目标是通过传入多个group.query参数实现多规则分组,对应可正常运行的curl命令(原命令存在引号未闭合的语法问题,已修正)如下:

curl -G http://localhost:8983/solr/testColl/select?indent=true --data-urlencode "q=*:*" --data-urlencode "group=true" --data-urlencode "group.query=UnivesityName:'University~' AND UnivesityName:'Toronto~'" --data-urlencode "group.query=UnivesityName:'University~' AND UnivesityName:'british~' AND UnivesityName:'columbia~'" --data-urlencode "group.limit=30"
现有问题

初始编写的SolrJ代码仅传入了1个group.query参数,无法实现多分组效果,问题代码如下:

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.response.Group;
import org.apache.solr.client.solrj.response.GroupCommand;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.params.CommonParams;

//Preparing the Solr query   
SolrQuery query = new SolrQuery();

query.add(CommonParams.Q, "*:*");
query.set("group", "true");
query.set("group.limit", "30");

// 仅设置了1个group.query,且set方法会覆盖同key的已有参数值
query.set("group.query", "UnivesityName:'University~' AND UnivesityName:'Toronto~'");
解决方法

SolrQuery的set(key, value)方法对同名参数会执行覆盖操作,多次调用只会保留最后一次设置的值,因此无法传递多个group.query。要实现和curl一致的多同名参数传递效果,改用add(key, value)方法追加参数即可——该方法会保留同名参数的多个值,发起请求时会自动序列化为HTTP协议支持的多同名参数格式。

修正后的核心代码如下(可以引入GroupParams常量避免硬编码参数名,减少拼写错误):

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.GroupParams;

SolrQuery query = new SolrQuery();
query.add(CommonParams.Q, "*:*");
query.set(GroupParams.GROUP, "true");
query.set(GroupParams.GROUP_LIMIT, "30");

// 用add方法依次追加多个group.query规则,参数不会互相覆盖
query.add(GroupParams.GROUP_QUERY, "UnivesityName:'University~' AND UnivesityName:'Toronto~'");
query.add(GroupParams.GROUP_QUERY, "UnivesityName:'University~' AND UnivesityName:'british~' AND UnivesityName:'columbia~'");

后续解析结果时,从QueryResponse#getGroupResponse()中获取的GroupCommand列表会按传入顺序对应每一个group.query规则,返回结构和curl请求的返回结果完全一致。

内容的提问来源于stack exchange,提问作者user595014

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:54:03