Skip to content

Commit

Permalink
allow term queries on numerically indexed fields. closes rnewson#61.
Browse files Browse the repository at this point in the history
  • Loading branch information
Robert Newson committed Jun 29, 2010
1 parent a280e10 commit ca21eec
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 0 deletions.
Expand Up @@ -26,6 +26,7 @@
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.util.Version;
import org.apache.lucene.index.Term;

/**
* Custom query parser that uses NumericFieldQuery where appropriate.
Expand Down Expand Up @@ -123,4 +124,9 @@ protected Query getRangeQuery(final String field, final String lower, final Stri
return new TypedField(field).toRangeQuery(lower, upper, inclusive);
}

@Override
protected Query getFieldQuery(final String field, final String queryText) throws ParseException {
return new TypedField(field).toTermQuery(queryText);
}

}
Expand Up @@ -58,6 +58,10 @@ public int toSortField() {
public Query toRangeQuery(final String lower, final String upper, final boolean inclusive) throws ParseException {
return type.toRangeQuery(name, lower, upper, inclusive);
}

public Query toTermQuery(final String text) throws ParseException {
return type.toTermQuery(name, text);
}

@Override
public String toString() {
Expand Down
Expand Up @@ -22,12 +22,15 @@
import org.apache.lucene.document.AbstractField;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericField;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.MultiTermQuery;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.util.NumericUtils;

public enum FieldType {

Expand All @@ -43,6 +46,12 @@ public Query toRangeQuery(final String name, final String lower, final String up
throws ParseException {
return NumericRangeQuery.newLongRange(name, precisionStep, toDate(lower), toDate(upper), inclusive, inclusive);
}

@Override
public Query toTermQuery(final String name, final String text) throws ParseException {
final long date = toDate(text);
return new TermQuery(new Term(name, NumericUtils.longToPrefixCoded(date)));
}

},
DOUBLE(8, SortField.DOUBLE) {
Expand All @@ -55,6 +64,11 @@ public NumericField toField(final String name, final Object value, final ViewSet
public Query toRangeQuery(final String name, final String lower, final String upper, final boolean inclusive) {
return NumericRangeQuery.newDoubleRange(name, precisionStep, toDouble(lower), toDouble(upper), inclusive, inclusive);
}

@Override
public Query toTermQuery(final String name, final String text) {
return new TermQuery(new Term(name, NumericUtils.doubleToPrefixCoded(toDouble(text))));
}

private double toDouble(final Object obj) {
if (obj instanceof Number) {
Expand All @@ -74,6 +88,11 @@ public NumericField toField(final String name, final Object value, final ViewSet
public Query toRangeQuery(final String name, final String lower, final String upper, final boolean inclusive) {
return NumericRangeQuery.newFloatRange(name, precisionStep, toFloat(lower), toFloat(upper), inclusive, inclusive);
}

@Override
public Query toTermQuery(final String name, final String text) {
return new TermQuery(new Term(name, NumericUtils.floatToPrefixCoded(toFloat(text))));
}

private float toFloat(final Object obj) {
if (obj instanceof Number) {
Expand All @@ -92,6 +111,11 @@ public NumericField toField(final String name, final Object value, final ViewSet
public Query toRangeQuery(final String name, final String lower, final String upper, final boolean inclusive) {
return NumericRangeQuery.newIntRange(name, precisionStep, toInt(lower), toInt(upper), inclusive, inclusive);
}

@Override
public Query toTermQuery(final String name, final String text) {
return new TermQuery(new Term(name, NumericUtils.intToPrefixCoded(toInt(text))));
}

private int toInt(final Object obj) {
if (obj instanceof Number) {
Expand Down Expand Up @@ -119,6 +143,11 @@ private long toLong(final Object obj) {
return Long.parseLong(obj.toString());
}

@Override
public Query toTermQuery(final String name, final String text) {
return new TermQuery(new Term(name, NumericUtils.longToPrefixCoded(toLong(text))));
}

},
STRING(0, SortField.STRING) {
@Override
Expand All @@ -132,6 +161,11 @@ public Query toRangeQuery(final String name, final String lower, final String up
result.setRewriteMethod(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT);
return result;
}

@Override
public Query toTermQuery(String name, String text) {
return new TermQuery(new Term(name, text));
}
};

private static NumericField field(final String name, final int precisionStep, final ViewSettings settings) {
Expand Down Expand Up @@ -163,6 +197,8 @@ private FieldType(final int precisionStep, final int sortField) {

public abstract Query toRangeQuery(final String name, final String lower, final String upper, final boolean inclusive)
throws ParseException;

public abstract Query toTermQuery(final String name, final String text) throws ParseException;

public final int toSortField() {
return sortField;
Expand Down

0 comments on commit ca21eec

Please sign in to comment.