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.
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.

View File

@ -67,4 +67,14 @@ public interface TermsParams {
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";
}

View File

@ -34,6 +34,7 @@ import java.io.IOException;
* 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 {
@ -48,10 +49,11 @@ public class TermsComponent extends SearchComponent {
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 @@ public class TermsComponent extends SearchComponent {
(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 class TermsComponent extends SearchComponent {
}
public String getVersion() {
return "$Revision$";
return "$Revision:$";
}
public String getSourceId() {
@ -107,7 +111,7 @@ public class TermsComponent extends SearchComponent {
}
public String getSource() {
return "$Revision:$";
return "$URL:$";
}
public String getDescription() {

View File

@ -16,7 +16,6 @@ package org.apache.solr.handler.component;
* 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.SolrRequestHandler;
import org.apache.solr.request.LocalSolrQueryRequest;
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", "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 @@ public class TermsComponentTest extends AbstractSolrTestCase {
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);
}
}