在《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);
}
}