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
相关产品推荐
相关产品推荐

