FieldCache在lucene中使用的代码解析,使用场景个人分析这篇文章的由来是在寻求lucene的搜索的性能提高的过
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[]) { }}
解析就到这里了!代码整理是由baseworld的提点,导致了这些的产生,
在此感谢所有给我建议的人,感谢你们的帮助,
如果有人在fieldcache有不错的用法,请不吝啬手上的砖头,给点启发!
谢谢!
1 楼 yaozhan189 2008-12-01 对我帮助很大,慢慢研读~~~ 2 楼 moshalanye 2008-12-12 可能篇幅太长,好不容易整的啊,没什么人给意见,伤心下!希望有朋友能一起探讨下!:) 3 楼 yuxianghong 2008-12-15 很长时间没碰这个东西了.
有时间再过来看看. 4 楼 songzi0206 2009-10-21 不错的文章,不知道使用FieldCache对并发搜索性能提高有多大?希望lz不吝赐教 5 楼 moshalanye 2009-10-22 这个FieldCache 如果用在 filter上面 就让我感觉像 数据库的 index 的原理了,进行快速散列的效果,不过这个没有具体测试,这个适合用在分类字段上面。 6 楼 CapsLk 2009-11-05 看Mark Miller的Contrived FieldCache Load Test: Lucene 2.4 VS Lucene 2.9:
http://www.lucidimagination.com/blog/2009/09/22/contrived-fieldcache-load-test-lucene-2-4-vs-lucene-2-9
FieldCache的API:维护term的values的cache。我硬是没有看明白。
String[] entrys = FieldCache.DEFAULT.getStrings(reader, "field")
返回的是field内容的第一个word的数组。
int[] size = FieldCache.DEFAULT.getInts(reader, "field");
field的内容必须严格是int字符串,否则异常:java.lang.NumberFormatException。
跟着问一句:“如果有人在fieldcache有不错的用法,请不吝啬手上的砖头,给点启发! ”
7 楼 moshalanye 2009-11-05 建议 楼上的朋友再看下帖子和源代码!
FieldCache.DEFAULT 是使用默认实现,其中有多个api,使用的时候最好是针对那些不分词的字段使用,帖子里面有这样的原因说明
引用
int[] size = FieldCache.DEFAULT.getInts(reader, "field");
field的内容必须严格是int字符串,否则异常:java.lang.NumberFormatException。
你调用的是getInts 当然是int数组了,返回的东西是可以通过扩展进行自定义的。
再耐心的看看代码 你肯定会有收获 :〉