Date: 2004-04-04T13:30:06 Editor: StephaneVaucher <[EMAIL PROTECTED]> Wiki: Jakarta Lucene Wiki Page: SearchNumericalFields URL: http://wiki.apache.org/jakarta-lucene/SearchNumericalFields
Initial commit New Page: = Searching Numerical Fields = Original post: http://www.mail-archive.com/[EMAIL PROTECTED]/msg07107.html Goal: We want to do a search for something like this: [[BR]] number:[1 TO 2] and not have it return 11 or 103, etc. But, return 1.5, for example. Answer (from: http://issues.apache.org/eyebrowse/ReadMsg?listId=30&msgNo=7103, Erik Hatcher) == Utility to pad the numbers == public class Number''''''Utils { private static final Decimal''''''Format formatter = new Decimal''''''Format("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", Number''''''Utils.pad(i))); == Create a custom QueryParser subclass: == public class Custom''''''Query''''''Parser extends Query''''''Parser { public Custom''''''Query''''''Parser(String field, Analyzer analyzer) { super(field, analyzer); } protected Query getRangeQuery(String field, Analyzer analyzer, String part1, String part2, boolean inclusive) throws Parse''''''Exception { if ("id".equals(field)) { try { int num1 = Integer.parseInt(part1); int num2 = Integer.parseInt(part2); return new Range''''''Query(new Term(field, Number''''''Utils.pad(num1)), new Term(field, Number''''''Utils.pad(num2)), inclusive); } catch (Number''''''Format''''''Exception e) { throw new Parse''''''Exception(e.getMessage()); } } return super.getRangeQuery(field, analyzer, part1, part2, inclusive); } } Note: Only the "id" field is treated special, but your logic may vary. == Use the custom QueryParser == Custom``Query''''''Parser parser = new Custom''''''Query``Parser("field", analyzer); Query query = parser.parse("id:[37 TO 346]"); assertEquals("padded", "id:[00037 TO 00346]", query.toString("field")); == For decimals (sv) == You can use a multiplier to make sure you don't have decimals if they cause problems. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]