On Mar 5, 2004, at 4:16 PM, Erik Hatcher wrote:
Another quite cool option is to subclass QueryParser, and override
getRangeQuery. Do the padding there. This will allow users to type
in normal looking numbers, and the padding happens automatically.
You'll need to be sure that numbers padded during indexing matches
what getRangeQuery does (oh, say through a common function :).
Ok, here is a solution to storing integers and being able to use
QueryParser cleanly. First a utility to pad the numbers:
public class NumberUtils {
private static final DecimalFormat formatter =
new DecimalFormat("00000"); // make this as wide as you need
public static String pad(int n) {
return formatter.format(n);
}
}
Index the relevant fields using the pad function:
doc.add(Field.Keyword("id", NumberUtils.pad(i)));
Create a custom QueryParser subclass:
public class CustomQueryParser extends QueryParser {
public CustomQueryParser(String field, Analyzer analyzer) {
super(field, analyzer);
}
protected Query getRangeQuery(String field, Analyzer analyzer,
String part1, String part2,
boolean inclusive)
throws ParseException {
if ("id".equals(field)) {
try {
int num1 = Integer.parseInt(part1);
int num2 = Integer.parseInt(part2);
return new RangeQuery(new Term(field, NumberUtils.pad(num1)),
new Term(field, NumberUtils.pad(num2)),
inclusive);
} catch (NumberFormatException e) {
throw new ParseException(e.getMessage());
}
}
return super.getRangeQuery(field, analyzer, part1, part2,
inclusive);
}
}
Only the "id" field is treated special, but your logic may vary.
Then use the custom QueryParser:
CustomQueryParser parser =
new CustomQueryParser("field", analyzer);
Query query = parser.parse("id:[37 TO 346]");
assertEquals("padded", "id:[00037 TO 00346]",
query.toString("field"));
Thanks for the idea for a good example for the upcoming Lucene in
Action book... it's been added!
Erik
---------------------------------------------------------------------
To unsubscribe, e-mail: lucene-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: lucene-user-help@jakarta.apache.org