FieldCache在lucene中使用的代码解析,使用场景个人分析
这篇文章的由来是在寻求lucene的搜索的性能提高的过程中成形的,
感谢所有所以给于我帮助的朋友,在baseworld的提示下,我仔细翻阅了代码,
于是想把自己的一些收获和想法写出来,希望对在学习的人提供帮助,
更希望有人不吝啬手中的砖头,指正我的想法
FieldCache为FieldCacheImpl的接口,
其中有个名为default类型为FieldCacheImpl的静态对象,
FieldCacheImpl中包含一些重要的不同类型的Cache属性,
例如:bytesCache,stringsCache。。。
均继承于FieldCacheImpl.Cache抽象类,均实现抽象接口
protected abstract Object createValue(IndexReader reader, Object key)
throws IOException;
例如:
public class DigitalFilter extends Filter { static final String digitalRegex = "^\\d*\\.?\\d*$"; private Term t; public DigitalFilter(Term t) { this.t = t; } public BitSet bits(IndexReader reader) throws IOException { BitSet bitSet = new BitSet(reader.maxDoc()); /* 在此处调用了cache的getFloats方法,ExtendedFieldCache只是扩展了FieldCache,增加了LongCache 和DoubleCache,其他一样 */ float digital[] = ExtendedFieldCache.DEFAULT.getFloats( reader, t.field(), new FieldCache.FloatParser() { public float parseFloat(String string) { if (string.matches(digitalRegex)) return Float.parseFloat(string); return 0; } }); for (int i = 0; i < digital.length; i++) { if (digital[i] == Float.parseFloat(t.text())) bitSet.set(i); } return bitSet; } public static void main(String args[]) { }}