You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by gs...@apache.org on 2008/12/06 15:09:42 UTC

svn commit: r723985 - in /lucene/solr/trunk: CHANGES.txt src/java/org/apache/solr/common/params/TermsParams.java src/java/org/apache/solr/handler/component/TermsComponent.java src/test/org/apache/solr/handler/component/TermsComponentTest.java

Author: gsingers
Date: Sat Dec  6 06:09:42 2008
New Revision: 723985

URL: http://svn.apache.org/viewvc?rev=723985&view=rev
Log:
SOLR-877: added mincount and maxcount options

Modified:
    lucene/solr/trunk/CHANGES.txt
    lucene/solr/trunk/src/java/org/apache/solr/common/params/TermsParams.java
    lucene/solr/trunk/src/java/org/apache/solr/handler/component/TermsComponent.java   (contents, props changed)
    lucene/solr/trunk/src/test/org/apache/solr/handler/component/TermsComponentTest.java

Modified: lucene/solr/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/CHANGES.txt?rev=723985&r1=723984&r2=723985&view=diff
==============================================================================
--- lucene/solr/trunk/CHANGES.txt (original)
+++ lucene/solr/trunk/CHANGES.txt Sat Dec  6 06:09:42 2008
@@ -93,6 +93,7 @@
 
 18. SOLR-877: Added TermsComponent for accessing Lucene's TermEnum capabilities.
     Useful for auto suggest and possibly distributed search.  Not distributed search compliant.  (gsingers)
+    - Added mincount and maxcount options (Khee Chin via gsingers)
 
 19. SOLR-538: Add maxChars attribute for copyField function so that the length limit for destination
     can be specified.

Modified: lucene/solr/trunk/src/java/org/apache/solr/common/params/TermsParams.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/common/params/TermsParams.java?rev=723985&r1=723984&r2=723985&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/common/params/TermsParams.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/common/params/TermsParams.java Sat Dec  6 06:09:42 2008
@@ -67,4 +67,14 @@
   public static final String TERMS_ROWS = TERMS_PREFIX + "rows";
 
   public static final String TERMS_PREFIX_STR = TERMS_PREFIX + "prefix";
+
+  /**
+   * Optional.  The minimum value of docFreq to be returned.  1 by default
+   */
+  public static final String TERMS_MINCOUNT = TERMS_PREFIX + "mincount";
+  /**
+   * Optional.  The maximum value of docFreq to be returned.  -1 by default means no boundary
+   */
+  public static final String TERMS_MAXCOUNT = TERMS_PREFIX + "maxcount";
 }
+

Modified: lucene/solr/trunk/src/java/org/apache/solr/handler/component/TermsComponent.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/handler/component/TermsComponent.java?rev=723985&r1=723984&r2=723985&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/handler/component/TermsComponent.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/handler/component/TermsComponent.java Sat Dec  6 06:09:42 2008
@@ -34,6 +34,7 @@
  *      See Lucene's TermEnum class
  */
 public class TermsComponent extends SearchComponent {
+  public static final int UNLIMITED_MAX_COUNT = -1;
 
 
   public void process(ResponseBuilder rb) throws IOException {
@@ -45,13 +46,14 @@
         NamedList terms = new NamedList();
         rb.rsp.add("terms", terms);
         int rows = params.getInt(TermsParams.TERMS_ROWS, params.getInt(CommonParams.ROWS, 10));
-        if (rows < 0){
+        if (rows < 0) {
           rows = Integer.MAX_VALUE;
         }
-
         String upper = params.get(TermsParams.TERMS_UPPER);
         boolean upperIncl = params.getBool(TermsParams.TERMS_UPPER_INCLUSIVE, false);
         boolean lowerIncl = params.getBool(TermsParams.TERMS_LOWER_INCLUSIVE, true);
+        int freqmin = params.getInt(TermsParams.TERMS_MINCOUNT, 1); // initialize freqmin
+        int freqmax = params.getInt(TermsParams.TERMS_MAXCOUNT, UNLIMITED_MAX_COUNT); // initialize freqmax
         String prefix = params.get(TermsParams.TERMS_PREFIX_STR);
         for (int j = 0; j < fields.length; j++) {
           String field = fields[j];
@@ -77,17 +79,19 @@
                       (upperIncl == false && upperCmp < 0))
                       && (prefix == null || theText.startsWith(prefix))
                       ) {
-                fieldTerms.add(theText, termEnum.docFreq());
+                int docFreq = termEnum.docFreq();
+                if (docFreq >= freqmin && (freqmax == UNLIMITED_MAX_COUNT || (docFreq <= freqmax))) {
+                  fieldTerms.add(theText, docFreq);
+                  i++;
+                }
               } else {//we're done
                 break;
               }
-              i++;
             }
             while (i < rows && termEnum.next());
           }
           termEnum.close();
         }
-
       } else {
         throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No terms.fl parameter specified");
       }
@@ -99,7 +103,7 @@
   }
 
   public String getVersion() {
-    return "$Revision$";
+    return "$Revision:$";
   }
 
   public String getSourceId() {
@@ -107,7 +111,7 @@
   }
 
   public String getSource() {
-    return "$Revision:$";
+    return "$URL:$";
   }
 
   public String getDescription() {

Propchange: lucene/solr/trunk/src/java/org/apache/solr/handler/component/TermsComponent.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: lucene/solr/trunk/src/test/org/apache/solr/handler/component/TermsComponentTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/handler/component/TermsComponentTest.java?rev=723985&r1=723984&r2=723985&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/handler/component/TermsComponentTest.java (original)
+++ lucene/solr/trunk/src/test/org/apache/solr/handler/component/TermsComponentTest.java Sat Dec  6 06:09:42 2008
@@ -16,7 +16,6 @@
  * limitations under the License.
  */
 
-import org.mortbay.log.Log;
 import org.apache.solr.util.AbstractSolrTestCase;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.common.params.ModifiableSolrParams;
@@ -27,8 +26,6 @@
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryResponse;
 
-import java.util.Iterator;
-
 
 /**
  *
@@ -57,6 +54,14 @@
     assertU(adoc("id", "8", "lowerfilt", "baa", "standardfilt", "cccc"));
     assertU(adoc("id", "9", "lowerfilt", "bbb", "standardfilt", "ccccc"));
 
+    assertU(adoc("id", "10", "standardfilt", "ddddd"));
+    assertU(adoc("id", "11", "standardfilt", "ddddd"));
+    assertU(adoc("id", "12", "standardfilt", "ddddd"));
+    assertU(adoc("id", "13", "standardfilt", "ddddd"));
+    assertU(adoc("id", "14", "standardfilt", "d"));
+    assertU(adoc("id", "15", "standardfilt", "d"));
+    assertU(adoc("id", "16", "standardfilt", "d"));
+
     assertU("commit", commit());
   }
 
@@ -339,4 +344,48 @@
     assertTrue("b is null and it shouldn't be", terms.get("b") == null);
     assertTrue("baa is not null", terms.get("baa") == null);
   }
+
+  
+  public void testMinMaxFreq() throws Exception {
+    SolrCore core = h.getCore();
+    TermsComponent tc = (TermsComponent) core.getSearchComponent("termsComp");
+    assertTrue("tc is null and it shouldn't be", tc != null);
+    SolrRequestHandler handler;
+    SolrQueryResponse rsp;
+    NamedList values;
+    NamedList terms;
+    handler = core.getRequestHandler("/terms");
+    ModifiableSolrParams params = new ModifiableSolrParams();
+    params.add(TermsParams.TERMS, "true");
+    params.add(TermsParams.TERMS_FIELD, "lowerfilt");
+    params.add(TermsParams.TERMS_ROWS, String.valueOf(50));
+    // Tests TERMS_LOWER = "a" with freqmin = 2, freqmax = -1, terms.size() = 1
+    params.add(TermsParams.TERMS_LOWER, "a");
+    params.add(TermsParams.TERMS_MINCOUNT,String.valueOf(2));
+    params.add(TermsParams.TERMS_MAXCOUNT,String.valueOf(TermsComponent.UNLIMITED_MAX_COUNT));
+    rsp = new SolrQueryResponse();
+    rsp.add("responseHeader", new SimpleOrderedMap());
+    handler.handleRequest(new LocalSolrQueryRequest(core, params), rsp);
+    values = rsp.getValues();
+    terms = (NamedList) ((NamedList) values.get("terms")).get("lowerfilt");
+    assertTrue("terms Size: " + terms.size() + " is not: " + 1, terms.size() == 1);
+
+    params = new ModifiableSolrParams();
+    params.add(TermsParams.TERMS, "true");
+    params.add(TermsParams.TERMS_FIELD, "standardfilt");
+    params.add(TermsParams.TERMS_ROWS, String.valueOf(50));
+    // Tests TERMS_LOWER = "a" with freqmin = 2, freqmax = -1, terms.size() = 1
+    params.add(TermsParams.TERMS_LOWER, "d");
+    params.add(TermsParams.TERMS_MINCOUNT,String.valueOf(2));
+    params.add(TermsParams.TERMS_MAXCOUNT,String.valueOf(3));
+    rsp = new SolrQueryResponse();
+    rsp.add("responseHeader", new SimpleOrderedMap());
+    handler.handleRequest(new LocalSolrQueryRequest(core, params), rsp);
+    values = rsp.getValues();
+    terms = (NamedList) ((NamedList) values.get("terms")).get("standardfilt");
+    assertTrue("terms Size: " + terms.size() + " is not: " + 1, terms.size() == 1);
+    Integer d = (Integer) terms.get("d");
+    assertTrue(d + " does not equal: " + 3, d == 3);
+
+  }
 }