lucene-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Erik Hatcher <e...@ehatchersolutions.com>
Subject Re: Storing numbers
Date Sat, 06 Mar 2004 00:18:04 GMT
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


Mime
View raw message