SOLR-877: added mincount and maxcount options

git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@723985 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Grant Ingersoll 2008-12-06 14:09:42 +00:00
parent cedd07b500
commit 527bce2658
4 changed files with 74 additions and 10 deletions

View File

@ -93,6 +93,7 @@ New Features
18. SOLR-877: Added TermsComponent for accessing Lucene's TermEnum capabilities. 18. SOLR-877: Added TermsComponent for accessing Lucene's TermEnum capabilities.
Useful for auto suggest and possibly distributed search. Not distributed search compliant. (gsingers) 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 19. SOLR-538: Add maxChars attribute for copyField function so that the length limit for destination
can be specified. can be specified.

View File

@ -67,4 +67,14 @@ public interface TermsParams {
public static final String TERMS_ROWS = TERMS_PREFIX + "rows"; public static final String TERMS_ROWS = TERMS_PREFIX + "rows";
public static final String TERMS_PREFIX_STR = TERMS_PREFIX + "prefix"; 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";
} }

View File

@ -34,6 +34,7 @@ import java.io.IOException;
* See Lucene's TermEnum class * See Lucene's TermEnum class
*/ */
public class TermsComponent extends SearchComponent { public class TermsComponent extends SearchComponent {
public static final int UNLIMITED_MAX_COUNT = -1;
public void process(ResponseBuilder rb) throws IOException { public void process(ResponseBuilder rb) throws IOException {
@ -45,13 +46,14 @@ public class TermsComponent extends SearchComponent {
NamedList terms = new NamedList(); NamedList terms = new NamedList();
rb.rsp.add("terms", terms); rb.rsp.add("terms", terms);
int rows = params.getInt(TermsParams.TERMS_ROWS, params.getInt(CommonParams.ROWS, 10)); int rows = params.getInt(TermsParams.TERMS_ROWS, params.getInt(CommonParams.ROWS, 10));
if (rows < 0){ if (rows < 0) {
rows = Integer.MAX_VALUE; rows = Integer.MAX_VALUE;
} }
String upper = params.get(TermsParams.TERMS_UPPER); String upper = params.get(TermsParams.TERMS_UPPER);
boolean upperIncl = params.getBool(TermsParams.TERMS_UPPER_INCLUSIVE, false); boolean upperIncl = params.getBool(TermsParams.TERMS_UPPER_INCLUSIVE, false);
boolean lowerIncl = params.getBool(TermsParams.TERMS_LOWER_INCLUSIVE, true); 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); String prefix = params.get(TermsParams.TERMS_PREFIX_STR);
for (int j = 0; j < fields.length; j++) { for (int j = 0; j < fields.length; j++) {
String field = fields[j]; String field = fields[j];
@ -77,17 +79,19 @@ public class TermsComponent extends SearchComponent {
(upperIncl == false && upperCmp < 0)) (upperIncl == false && upperCmp < 0))
&& (prefix == null || theText.startsWith(prefix)) && (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 } else {//we're done
break; break;
} }
i++;
} }
while (i < rows && termEnum.next()); while (i < rows && termEnum.next());
} }
termEnum.close(); termEnum.close();
} }
} else { } else {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No terms.fl parameter specified"); throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No terms.fl parameter specified");
} }
@ -99,7 +103,7 @@ public class TermsComponent extends SearchComponent {
} }
public String getVersion() { public String getVersion() {
return "$Revision$"; return "$Revision:$";
} }
public String getSourceId() { public String getSourceId() {
@ -107,7 +111,7 @@ public class TermsComponent extends SearchComponent {
} }
public String getSource() { public String getSource() {
return "$Revision:$"; return "$URL:$";
} }
public String getDescription() { public String getDescription() {

View File

@ -16,7 +16,6 @@ package org.apache.solr.handler.component;
* limitations under the License. * limitations under the License.
*/ */
import org.mortbay.log.Log;
import org.apache.solr.util.AbstractSolrTestCase; import org.apache.solr.util.AbstractSolrTestCase;
import org.apache.solr.core.SolrCore; import org.apache.solr.core.SolrCore;
import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.params.ModifiableSolrParams;
@ -27,8 +26,6 @@ import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.request.LocalSolrQueryRequest; import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.request.SolrQueryResponse; import org.apache.solr.request.SolrQueryResponse;
import java.util.Iterator;
/** /**
* *
@ -57,6 +54,14 @@ public class TermsComponentTest extends AbstractSolrTestCase {
assertU(adoc("id", "8", "lowerfilt", "baa", "standardfilt", "cccc")); assertU(adoc("id", "8", "lowerfilt", "baa", "standardfilt", "cccc"));
assertU(adoc("id", "9", "lowerfilt", "bbb", "standardfilt", "ccccc")); 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()); assertU("commit", commit());
} }
@ -339,4 +344,48 @@ public class TermsComponentTest extends AbstractSolrTestCase {
assertTrue("b is null and it shouldn't be", terms.get("b") == null); assertTrue("b is null and it shouldn't be", terms.get("b") == null);
assertTrue("baa is not null", terms.get("baa") == 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);
}
} }