mirror of https://github.com/apache/lucene.git
SOLR-3406: Extended grouped faceting support to facet.query and facet.range parameters.
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1351219 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
bcaa52c562
commit
da70cee7ff
|
@ -266,6 +266,9 @@ New Features
|
|||
(Russell Black, ryan)
|
||||
|
||||
* SOLR-2898: Support grouped faceting. (Martijn van Groningen)
|
||||
Additional Work:
|
||||
SOLR-3406: Extended grouped faceting support to facet.query and facet.range parameters.
|
||||
(David Boychuck, Martijn van Groningen)
|
||||
|
||||
* SOLR-2949: QueryElevationComponent is now supported with distributed search.
|
||||
(Mark Miller, yonik)
|
||||
|
|
|
@ -22,6 +22,7 @@ import org.apache.lucene.queryparser.classic.ParseException;
|
|||
import org.apache.lucene.search.*;
|
||||
import org.apache.lucene.search.grouping.AbstractAllGroupHeadsCollector;
|
||||
import org.apache.lucene.search.grouping.term.TermGroupFacetCollector;
|
||||
import org.apache.lucene.search.grouping.term.TermAllGroupsCollector;
|
||||
import org.apache.lucene.util.*;
|
||||
import org.apache.lucene.util.packed.PackedInts;
|
||||
import org.apache.solr.common.SolrException;
|
||||
|
@ -233,19 +234,45 @@ public class SimpleFacets {
|
|||
|
||||
String[] facetQs = params.getParams(FacetParams.FACET_QUERY);
|
||||
|
||||
|
||||
if (null != facetQs && 0 != facetQs.length) {
|
||||
for (String q : facetQs) {
|
||||
parseParams(FacetParams.FACET_QUERY, q);
|
||||
|
||||
// TODO: slight optimization would prevent double-parsing of any localParams
|
||||
Query qobj = QParser.getParser(q, null, req).getQuery();
|
||||
res.add(key, searcher.numDocs(qobj, base));
|
||||
|
||||
if (params.getBool(GroupParams.GROUP_FACET, false)) {
|
||||
res.add(key, getGroupedFacetQueryCount(qobj));
|
||||
} else {
|
||||
res.add(key, searcher.numDocs(qobj, base));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a grouped facet count for the facet query
|
||||
*
|
||||
* @see FacetParams#FACET_QUERY
|
||||
*/
|
||||
public int getGroupedFacetQueryCount(Query facetQuery) throws IOException {
|
||||
GroupingSpecification groupingSpecification = rb.getGroupingSpec();
|
||||
String groupField = groupingSpecification != null ? groupingSpecification.getFields()[0] : null;
|
||||
if (groupField == null) {
|
||||
throw new SolrException (
|
||||
SolrException.ErrorCode.BAD_REQUEST,
|
||||
"Specify the group.field as parameter or local parameter"
|
||||
);
|
||||
}
|
||||
|
||||
TermAllGroupsCollector collector = new TermAllGroupsCollector(groupField);
|
||||
Filter mainQueryFilter = docs.getTopFilter(); // This returns a filter that only matches documents matching with q param and fq params
|
||||
searcher.search(facetQuery, mainQueryFilter, collector);
|
||||
return collector.getGroupCount();
|
||||
}
|
||||
|
||||
public NamedList<Integer> getTermCounts(String field) throws IOException {
|
||||
int offset = params.getFieldInt(field, FacetParams.FACET_OFFSET, 0);
|
||||
|
@ -1172,7 +1199,11 @@ public class SimpleFacets {
|
|||
protected int rangeCount(SchemaField sf, String low, String high,
|
||||
boolean iLow, boolean iHigh) throws IOException {
|
||||
Query rangeQ = sf.getType().getRangeQuery(null, sf,low,high,iLow,iHigh);
|
||||
return searcher.numDocs(rangeQ ,base);
|
||||
if (params.getBool(GroupParams.GROUP_FACET, false)) {
|
||||
return getGroupedFacetQueryCount(rangeQ);
|
||||
} else {
|
||||
return searcher.numDocs(rangeQ ,base);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -26,14 +26,9 @@ import org.apache.solr.util.TimeZoneUtils;
|
|||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.HashSet;
|
||||
import java.util.TimeZone;
|
||||
|
||||
|
||||
public class SimpleFacetsTest extends SolrTestCaseJ4 {
|
||||
|
@ -119,6 +114,42 @@ public class SimpleFacetsTest extends SolrTestCaseJ4 {
|
|||
add_doc("id", "2004", "hotel_s1", "b", "airport_s1", "ams", "duration_i1", "5");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleGroupedQueryRangeFacets() throws Exception {
|
||||
assertQ(
|
||||
req(
|
||||
"q", "*:*",
|
||||
"fq", "id:[2000 TO 2004]",
|
||||
"group", "true",
|
||||
"group.facet", "true",
|
||||
"group.field", "hotel_s1",
|
||||
"facet", "true",
|
||||
"facet.query", "airport_s1:ams"
|
||||
),
|
||||
"//lst[@name='facet_queries']/int[@name='airport_s1:ams'][.='2']"
|
||||
);
|
||||
assertQ(
|
||||
req(
|
||||
"q", "*:*",
|
||||
"fq", "id:[2000 TO 2004]",
|
||||
"group", "true",
|
||||
"group.facet", "true",
|
||||
"group.field", "hotel_s1",
|
||||
"facet", "true",
|
||||
"facet.range", "duration_i1",
|
||||
"facet.range.start", "5",
|
||||
"facet.range.end", "11",
|
||||
"facet.range.gap", "1"
|
||||
),
|
||||
"//lst[@name='facet_ranges']/lst[@name='duration_i1']/lst[@name='counts']/int[@name='5'][.='2']",
|
||||
"//lst[@name='facet_ranges']/lst[@name='duration_i1']/lst[@name='counts']/int[@name='6'][.='0']",
|
||||
"//lst[@name='facet_ranges']/lst[@name='duration_i1']/lst[@name='counts']/int[@name='7'][.='0']",
|
||||
"//lst[@name='facet_ranges']/lst[@name='duration_i1']/lst[@name='counts']/int[@name='8'][.='0']",
|
||||
"//lst[@name='facet_ranges']/lst[@name='duration_i1']/lst[@name='counts']/int[@name='9'][.='0']",
|
||||
"//lst[@name='facet_ranges']/lst[@name='duration_i1']/lst[@name='counts']/int[@name='10'][.='2']"
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleGroupedFacets() throws Exception {
|
||||
assertQ(
|
||||
|
|
Loading…
Reference in New Issue