一个辅助Lucene对数字类型进行索引和搜索的工具类

        在《Lucene in action》2.5  Indexing numbers 中提到,如果希望对数据类型进行搜索,在创建索引的时候要采用KeyWord类型的Field,对应到Lucene2.0,就是:

       new Field("field",number,Field.Store.YES,Field.Index.UN_TOKENIZED)

      但是在进行这一步之前,还要对数字进行处理。原因是对于像7,71,20这样的数字在转换为字符串并被创建索引之后,在进行范围搜索(range queries)的时候Lucene并不按照自然顺序(natural order)排序,而是按照词典顺序(lexicographical order)排序,即"20","7","71"。

        解决的方法就是在字符串前补“0”,使自然顺序和字典顺序取得一致。并且在《Lucene in action》6.3.3提供了一个NumberUtils类,用DecimalFormat对数字进行格式化。

        这个类只提供了一个将数字格式化为前面带若干个“0”的字符串形势,而没有提供将格式字符串还原为正常的数字形式的方法。因此我又添加了一个还原方法,最后该类如下:

        import java.text.DecimalFormat;
        import java.util.regex.Matcher;
        import java.util.regex.Pattern; 

        public class NumberUtils{
 
            private static final DecimalFormat formatter =new DecimalFormat("00000000.00");
            private static final Pattern pattern=Pattern.compile("^([0]*)([1-9][0-9]*//.[0-9]*)$");
 
            public static String pad(float n) {
            return formatter.format(n);
       }
 
       public static String revert(String n){
           Matcher matcher=pattern.matcher(n);
           matcher.matches();
           return matcher.group(2);
       }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值