You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2015/04/26 16:16:49 UTC

svn commit: r1676107 - in /lucene/dev/trunk/solr: ./ core/src/java/org/apache/solr/search/facet/ core/src/test/org/apache/solr/search/facet/

Author: yonik
Date: Sun Apr 26 14:16:49 2015
New Revision: 1676107

URL: http://svn.apache.org/r1676107
Log:
SOLR-7473: implement facet range mincount

Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1676107&r1=1676106&r2=1676107&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Sun Apr 26 14:16:49 2015
@@ -119,6 +119,12 @@ New Features
   "facet.range.method=filter") or DocValues ("facet.range.method=dv"). 
   Input parameters and output of both methods are the same. (Tomás Fernández Löbbe)
 
+* SOLR-7473: Facet Module (Json Facet API) range faceting now supports the "mincount"
+  parameter in range facets to supress buckets less than that count.  The default
+  for "mincount" remains 0 for range faceting.
+  Example: prices:{ type:range, field:price, mincount:1, start:0, end:100, gap:10 }
+  (yonik)
+
 Bug Fixes
 ----------------------
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java?rev=1676107&r1=1676106&r2=1676107&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java Sun Apr 26 14:16:49 2015
@@ -781,6 +781,7 @@ class FacetRangeMerger extends FacetBuck
     mergeBucketList(bucketList);
   }
 
+  // TODO: share more merging with field faceting
   public void mergeBucketList(List<SimpleOrderedMap> bucketList) {
     for (SimpleOrderedMap bucketRes : bucketList) {
       Comparable bucketVal = (Comparable)bucketRes.get("val");
@@ -798,14 +799,11 @@ class FacetRangeMerger extends FacetBuck
     SimpleOrderedMap result = new SimpleOrderedMap(4);
 
     List<SimpleOrderedMap> resultBuckets = new ArrayList<>(buckets.size());
-    // TODO: if we implement mincount for ranges, we'll need to sort buckets (see FacetFieldMerger)
 
     for (FacetBucket bucket : buckets.values()) {
-      /***
        if (bucket.getCount() < freq.mincount) {
-       continue;
+         continue;
        }
-       ***/
       resultBuckets.add( bucket.getMergedBucket() );
     }
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java?rev=1676107&r1=1676106&r2=1676107&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java Sun Apr 26 14:16:49 2015
@@ -23,9 +23,7 @@ import java.util.Date;
 import java.util.EnumSet;
 import java.util.List;
 
-import org.apache.lucene.index.Term;
 import org.apache.lucene.search.Query;
-import org.apache.lucene.search.TermQuery;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.FacetParams;
 import org.apache.solr.common.util.SimpleOrderedMap;
@@ -44,6 +42,8 @@ public class FacetRange extends FacetReq
   boolean hardend = false;
   EnumSet<FacetParams.FacetRangeInclude> include;
   EnumSet<FacetParams.FacetRangeOther> others;
+  long mincount = 0;
+
 
   @Override
   public FacetProcessor createFacetProcessor(FacetContext fcontext) {
@@ -62,6 +62,7 @@ class FacetRangeProcessor extends FacetP
   Calc calc;
   List<Range> rangeList;
   List<Range> otherList;
+  long effectiveMincount;
 
   FacetRangeProcessor(FacetContext fcontext, FacetRange freq) {
     super(fcontext, freq);
@@ -69,8 +70,11 @@ class FacetRangeProcessor extends FacetP
 
   @Override
   public void process() throws IOException {
-    sf = fcontext.searcher.getSchema().getField(freq.field);
+    // Under the normal mincount=0, each shard will need to return 0 counts since we don't calculate buckets at the top level.
+    // But if mincount>0 then our sub mincount can be set to 1.
 
+    effectiveMincount = fcontext.isShard() ? (freq.mincount > 0 ? 1 : 0) : freq.mincount;
+    sf = fcontext.searcher.getSchema().getField(freq.field);
     response = getRangeCounts();
   }
 
@@ -236,6 +240,7 @@ class FacetRangeProcessor extends FacetP
     res.add("buckets", buckets);
 
     for (int idx = 0; idx<rangeList.size(); idx++) {
+      if (effectiveMincount > 0 && countAcc.getCount(idx) < effectiveMincount) continue;
       Range range = rangeList.get(idx);
       SimpleOrderedMap bucket = new SimpleOrderedMap();
       buckets.add(bucket);
@@ -245,6 +250,7 @@ class FacetRangeProcessor extends FacetP
     }
 
     for (int idx = 0; idx<otherList.size(); idx++) {
+      // we dont' skip these buckets based on mincount
       Range range = otherList.get(idx);
       SimpleOrderedMap bucket = new SimpleOrderedMap();
       res.add(range.label.toString(), bucket);

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java?rev=1676107&r1=1676106&r2=1676107&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java Sun Apr 26 14:16:49 2015
@@ -686,6 +686,7 @@ class FacetRangeParser extends FacetPars
     facet.end = m.get("end");
     facet.gap = m.get("gap");
     facet.hardend = getBoolean(m, "hardend", facet.hardend);
+    facet.mincount = getLong(m, "mincount", 0);
 
     // TODO: refactor list-of-options code
 

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java?rev=1676107&r1=1676106&r2=1676107&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java Sun Apr 26 14:16:49 2015
@@ -690,6 +690,16 @@ public class TestJsonFacets extends Solr
             " } }"
     );
 
+    // range facet with mincount
+    client.testJQ(params(p, "q", "*:*"
+            , "json.facet", "{f:{type:range, field:${num_d}, start:-5, end:10, gap:5, other:all, mincount:2,    facet:{ x:'sum(${num_i})', ny:{query:'${where_s}:NY'}}   }}"
+        )
+        , "facets=={count:6, f:{buckets:[  {val:0.0,count:2,x:5.0,ny:{count:1}} ]" +
+            ",before: {count:1,x:-5.0,ny:{count:0}}" +
+            ",after:  {count:1,x:7.0, ny:{count:0}}" +
+            ",between:{count:3,x:0.0, ny:{count:2}}" +
+            " } }"
+    );
 
     // range facet with sub facets and stats, with "other:all", on subset
     client.testJQ(params(p, "q", "id:(3 4 6)"
@@ -702,6 +712,8 @@ public class TestJsonFacets extends Solr
             " } }"
     );
 
+
+
     // stats at top level
     client.testJQ(params(p, "q", "*:*"
             , "json.facet", "{ sum1:'sum(${num_d})', sumsq1:'sumsq(${num_d})', avg1:'avg(${num_d})', min1:'min(${num_d})', max1:'max(${num_d})', numwhere:'unique(${where_s})', unique_num_i:'unique(${num_i})', unique_num_d:'unique(${num_d})', unique_date:'unique(${date})',  med:'percentile(${num_d},50)', perc:'percentile(${num_d},0,50.0,100)' }"