参考wiki:http://wiki.apache.org/solr/FieldCollapsing#Result_Grouping_.2BAC8_Field_Collapsing
一、实现的相关类:SolrServer、SolrQuery、QueryResponse、GroupResponse、GroupCommand、Group、SolrDocumentList
(1) SolrServer类 提供与Solr实例的连接与通信。
SolrServer solr = new HttpSolrServer("http://localhost:8983/solr");
(2) SolrQuery类 提供查询的相关参数;
SolrQuery继承于 ModifiableSolrParams,而ModifiableSolrParams则继承与SolrParams。
// http://localhost:8983/solr/select?q=学生&group=true&group.field=age //ModifiableSolrParams params = new ModifiableSolrParams(); SolrQuery params = new SolrQuery(); //the common parameters for all search params.set("q", "*:*"); params.set("fq", "age:[20 TO 30]", "grade:[70 TO *]"); // filter query params.set("fl", "*,score"); // field list params.set("sort", "grade desc" ); //default score desc. params.set("start", "0"); params.set("rows", "10"); params.set("timeAllowed", "30000"); //miliseconds //params.set("wt", "xml"); // the response writer type params.set("omitHeader", "true"); //default false params.set("cache", "false"); //default true //parameters only for grouping result params.set("group", "true"); params.set("group.field", "id", "age"); params.set("group.query", "学生", "学习", "grade:[0 TO 59.9]", "grade:[60 TO *]", "age:[10 TO 19]", "age:[20 TO *]" ); //params.set("group.func", "grade GRATERTHAN 60"); // not found, don't use it!!! params.set("group.sort", "grade desc"); params.set("group.format", "grouped"); //default:simple, other:grouped params.set("group.main", "false"); // when /*group.format=simple and */ group.main=true, just return the documentList only!!! params.set("group.ngroups", "true"); params.set("group.truncate", "true"); //default is false; params.set("group.cache.percent", "50"); //default is 0; params.set("group.offset", "0"); params.set("group.limit", "10"); // 分布式设置 //params.set("shards", "localhost:8983/solr1", "localhost:8983/solr2"); //shards=host:port/base_url[,host:port:/base_url,[....]] //params.set("shards.qt", "/select"); // qt: query type// to indicate the request Handler to use
(3) QueryResponse类提供查询的的结果:
QueryResponse response = null; try { response = solr.query(params); //System.out.println("查询耗时:" + response.getQTime()); } catch (SolrServerException e) { System.err.println(e.getMessage()); e.printStackTrace(); } catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(); } finally { solr.shutdown(); }(4)GroupResponse提供基于分组的查询结果:
获取GroupResponse:
GroupResponse groupResponse = response.getGroupResponse();
if (response != null) { GroupResponse groupResponse = response.getGroupResponse(); if (groupResponse != null) { List<GroupCommand> groupCommandList = groupResponse.getValues(); for (GroupCommand groupCommand : groupCommandList) { System.out.println("GroupCommand Name : " + groupCommand.getName()); System.out.println("Num of Groups Found: " + groupCommand.getNGroups()); System.out.println("Num of documents Found: " + groupCommand.getMatches()); System.out.println("The groups are: "); List<Group> groups = groupCommand.getValues(); for (Group group : groups) { System.out.println("group value: " + group.getGroupValue()); SolrDocumentList solrDocumentList = group.getResult(); System.out.println("Num of Documents in this group: " + solrDocumentList.getNumFound()); System.out.println("start: " + solrDocumentList.getStart()); System.out.println("Max score: " + solrDocumentList.getMaxScore()); // solrDocumentList.get(index) for (SolrDocument doc : solrDocumentList) { System.out.println("the Fields of document:"); Collection<String> names = doc.getFieldNames(); for (String name : names) { System.out.println(name + ": " + doc.getFieldValue(name)); } System.out.println("\n"); } System.out.println("\n\n"); } System.out.println("\n\n"); } }
package cn.wzb; import java.util.Collection; import java.util.List; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.Group; import org.apache.solr.client.solrj.response.GroupCommand; import org.apache.solr.client.solrj.response.GroupResponse; 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.ModifiableSolrParams; public class TestGroup { public static void main(String[] args) { SolrServer solr = new HttpSolrServer("http://localhost:8983/solr"); // http://localhost:8983/solr/select?q=学生&group=true&group.field=age //ModifiableSolrParams params = new ModifiableSolrParams(); SolrQuery params = new SolrQuery(); //the common parameters for all search params.set("q", "*:*"); params.set("fq", "age:[20 TO 30]", "grade:[70 TO *]"); // filter query params.set("fl", "*,score"); // field list params.set("sort", "grade desc" ); //default score desc. params.set("start", "0"); params.set("rows", "10"); params.set("timeAllowed", "30000"); //miliseconds //params.set("wt", "xml"); // the response writer type params.set("omitHeader", "true"); //default false params.set("cache", "false"); //default true //parameters only for grouping result params.set("group", "true"); params.set("group.field", "id", "age"); params.set("group.query", "学生", "学习", "grade:[0 TO 59.9]", "grade:[60 TO *]", "age:[10 TO 19]", "age:[20 TO *]" ); //params.set("group.func", "grade GRATERTHAN 60"); // not found, don't use it!!! params.set("group.sort", "grade desc"); params.set("group.format", "grouped"); //default:simple, other:grouped params.set("group.main", "false"); // when /*group.format=simple and */ group.main=true, just return the documentList only!!! params.set("group.ngroups", "true"); params.set("group.truncate", "true"); //default is false; params.set("group.cache.percent", "50"); //default is 0; params.set("group.offset", "0"); params.set("group.limit", "10"); // 分布式设置 //params.set("shards", "localhost:8983/solr1", "localhost:8983/solr2"); //shards=host:port/base_url[,host:port:/base_url,[....]] //params.set("shards.qt", "/select"); // qt: query type// to indicate the request Handler to use QueryResponse response = null; try { response = solr.query(params); //System.out.println("查询耗时:" + response.getQTime()); } catch (SolrServerException e) { System.err.println(e.getMessage()); e.printStackTrace(); } catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(); } finally { solr.shutdown(); } if (response != null) { GroupResponse groupResponse = response.getGroupResponse(); if (groupResponse != null) { List<GroupCommand> groupCommandList = groupResponse.getValues(); for (GroupCommand groupCommand : groupCommandList) { System.out.println("GroupCommand Name : " + groupCommand.getName()); System.out.println("Num of Groups Found: " + groupCommand.getNGroups()); System.out.println("Num of documents Found: " + groupCommand.getMatches()); System.out.println("The groups are: "); List<Group> groups = groupCommand.getValues(); for (Group group : groups) { System.out.println("group value: " + group.getGroupValue()); SolrDocumentList solrDocumentList = group.getResult(); System.out.println("Num of Documents in this group: " + solrDocumentList.getNumFound()); System.out.println("start: " + solrDocumentList.getStart()); System.out.println("Max score: " + solrDocumentList.getMaxScore()); // solrDocumentList.get(index) for (SolrDocument doc : solrDocumentList) { System.out.println("the Fields of document:"); Collection<String> names = doc.getFieldNames(); for (String name : names) { System.out.println(name + ": " + doc.getFieldValue(name)); } System.out.println("\n"); } System.out.println("\n\n"); } System.out.println("\n\n"); } } //System.out.println("response = " + response); //System.out.println(response.getStatus()); System.out.println("查询耗时:" + response.getQTime()); } solr.shutdown(); } }
测试结果:
2012-8-17 14:04:52 org.apache.solr.client.solrj.impl.HttpClientUtil createClient 信息: Creating new http client, config:maxConnections=128&maxConnectionsPerHost=32&followRedirects=false GroupCommand Name : id Num of Groups Found: 3 Num of documents Found: 3 The groups are: group value: no3 Num of Documents in this group: 1 start: 0 Max score: 1.0 the Fields of document: id: no3 number: 3 name: 王五 grade: 94.8 age: 25 introduction: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text_auto: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title_smart: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 entranceTime: Wed Jan 05 00:05:00 CST 2005 deposit: 3000.0009 score: 1.0 group value: no4 Num of Documents in this group: 1 start: 0 Max score: 1.0 the Fields of document: id: no4 number: 4 name: 沈六 grade: 80.8 age: 30 introduction: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar text_auto: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar text: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar title: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar title_smart: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar entranceTime: Tue Jan 10 00:09:00 CST 2006 deposit: 90000.000788 score: 1.0 group value: no5 Num of Documents in this group: 1 start: 0 Max score: 1.0 the Fields of document: id: no5 number: 4 name: 江八 grade: 70.8 age: 25 introduction: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo text_auto: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo text: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo title: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo title_smart: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo entranceTime: Wed Jan 10 00:09:00 CST 2007 deposit: 2343900.000788 score: 1.0 GroupCommand Name : age Num of Groups Found: 2 Num of documents Found: 3 The groups are: group value: 25 Num of Documents in this group: 2 start: 0 Max score: 1.0 the Fields of document: id: no3 number: 3 name: 王五 grade: 94.8 age: 25 introduction: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text_auto: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title_smart: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 entranceTime: Wed Jan 05 00:05:00 CST 2005 deposit: 3000.0009 score: 1.0 the Fields of document: id: no5 number: 4 name: 江八 grade: 70.8 age: 25 introduction: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo text_auto: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo text: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo title: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo title_smart: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo entranceTime: Wed Jan 10 00:09:00 CST 2007 deposit: 2343900.000788 score: 1.0 group value: 30 Num of Documents in this group: 1 start: 0 Max score: 1.0 the Fields of document: id: no4 number: 4 name: 沈六 grade: 80.8 age: 30 introduction: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar text_auto: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar text: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar title: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar title_smart: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar entranceTime: Tue Jan 10 00:09:00 CST 2006 deposit: 90000.000788 score: 1.0 GroupCommand Name : sub(grade, 60) Num of Groups Found: 3 Num of documents Found: 3 The groups are: group value: 34.800003 Num of Documents in this group: 1 start: 0 Max score: 1.0 the Fields of document: id: no3 number: 3 name: 王五 grade: 94.8 age: 25 introduction: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text_auto: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title_smart: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 entranceTime: Wed Jan 05 00:05:00 CST 2005 deposit: 3000.0009 score: 1.0 group value: 20.800003 Num of Documents in this group: 1 start: 0 Max score: 1.0 the Fields of document: id: no4 number: 4 name: 沈六 grade: 80.8 age: 30 introduction: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar text_auto: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar text: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar title: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar title_smart: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar entranceTime: Tue Jan 10 00:09:00 CST 2006 deposit: 90000.000788 score: 1.0 group value: 10.800003 Num of Documents in this group: 1 start: 0 Max score: 1.0 the Fields of document: id: no5 number: 4 name: 江八 grade: 70.8 age: 25 introduction: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo text_auto: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo text: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo title: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo title_smart: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo entranceTime: Wed Jan 10 00:09:00 CST 2007 deposit: 2343900.000788 score: 1.0 GroupCommand Name : 学生 Num of Groups Found: null Num of documents Found: 3 The groups are: group value: 学生 Num of Documents in this group: 1 start: 0 Max score: 1.0 the Fields of document: id: no3 number: 3 name: 王五 grade: 94.8 age: 25 introduction: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text_auto: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title_smart: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 entranceTime: Wed Jan 05 00:05:00 CST 2005 deposit: 3000.0009 score: 1.0 GroupCommand Name : 学习 Num of Groups Found: null Num of documents Found: 3 The groups are: group value: 学习 Num of Documents in this group: 2 start: 0 Max score: 1.0 the Fields of document: id: no3 number: 3 name: 王五 grade: 94.8 age: 25 introduction: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text_auto: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title_smart: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 entranceTime: Wed Jan 05 00:05:00 CST 2005 deposit: 3000.0009 score: 1.0 the Fields of document: id: no5 number: 4 name: 江八 grade: 70.8 age: 25 introduction: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo text_auto: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo text: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo title: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo title_smart: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo entranceTime: Wed Jan 10 00:09:00 CST 2007 deposit: 2343900.000788 score: 1.0 GroupCommand Name : grade:[0 TO 59.9] Num of Groups Found: null Num of documents Found: 3 The groups are: group value: grade:[0 TO 59.9] Num of Documents in this group: 0 start: 0 Max score: NaN GroupCommand Name : grade:[60 TO *] Num of Groups Found: null Num of documents Found: 3 The groups are: group value: grade:[60 TO *] Num of Documents in this group: 3 start: 0 Max score: 1.0 the Fields of document: id: no3 number: 3 name: 王五 grade: 94.8 age: 25 introduction: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text_auto: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title_smart: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 entranceTime: Wed Jan 05 00:05:00 CST 2005 deposit: 3000.0009 score: 1.0 the Fields of document: id: no4 number: 4 name: 沈六 grade: 80.8 age: 30 introduction: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar text_auto: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar text: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar title: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar title_smart: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar entranceTime: Tue Jan 10 00:09:00 CST 2006 deposit: 90000.000788 score: 1.0 the Fields of document: id: no5 number: 4 name: 江八 grade: 70.8 age: 25 introduction: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo text_auto: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo text: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo title: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo title_smart: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo entranceTime: Wed Jan 10 00:09:00 CST 2007 deposit: 2343900.000788 score: 1.0 GroupCommand Name : age:[10 TO 19] Num of Groups Found: null Num of documents Found: 3 The groups are: group value: age:[10 TO 19] Num of Documents in this group: 0 start: 0 Max score: NaN GroupCommand Name : age:[20 TO *] Num of Groups Found: null Num of documents Found: 3 The groups are: group value: age:[20 TO *] Num of Documents in this group: 3 start: 0 Max score: 1.0 the Fields of document: id: no3 number: 3 name: 王五 grade: 94.8 age: 25 introduction: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text_auto: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 text: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 title_smart: bazaaa,bbbfoo 他是一个好学生,学习优秀,是一个法国人 entranceTime: Wed Jan 05 00:05:00 CST 2005 deposit: 3000.0009 score: 1.0 the Fields of document: id: no4 number: 4 name: 沈六 grade: 80.8 age: 30 introduction: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar text_auto: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar text: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar title: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar title_smart: bbbfoo 他已经毕业了,现在开始工作了, 德国人,aaabar entranceTime: Tue Jan 10 00:09:00 CST 2006 deposit: 90000.000788 score: 1.0 the Fields of document: id: no5 number: 4 name: 江八 grade: 70.8 age: 25 introduction: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo text_auto: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo text: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo title: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo title_smart: bbbbar 他毕业了,现在开始工作了,但是仍在认真学习,日本人 ,aaafoo entranceTime: Wed Jan 10 00:09:00 CST 2007 deposit: 2343900.000788 score: 1.0 查询耗时:0