Lucene真的是一个很强大的东东。把索引和检索这么复杂的处理,抽象出来,包装成一个库,提供几个简单地接口就可以搞定很多事情。其接口的简洁和优雅,非常值得我们去学习。
相对于其他的开源库,Lucene的各种开发文档,还算比较丰富。《Lucene in Action》(其中文版,我查阅各大书店都没找到,看来买的很火爆)这本书上面也把各种示例讲的比较详细。但要想用好,仍然不是件容易的事情。有许多tricky的地方。需要针对自己的需求,采取一些优化的手段。这样就不得不读这两篇文章:
• ImproveIndexingSpeed
• ImproveSearchingSpeed
就在Lucene官方站点的wiki里面找到的。嗯,谨记!一定要多读官方文档。在网上搜寻各种优化策略,大致脱离不来这两篇文章中总结的几个要点。我对其中“在搜索中多用filter”体会颇深。
在我的搜素第一跑起来时,那个慢啊,搜索一个结果比较多的内容,需要2秒左右,非常吓人。经分析和测试在知道,时间都耗费在我的Collector器中的collect(id, score)中。因为我在其中做了很多通过id获取文档内容,在根据其中字段的值来过滤id的操作。这样导致每。获取一个id,就需要去获取整个文档的内容,然后取出某个域的内容来做过滤逻辑。如果搜索词有上万的结果的话,这个操作就非常吓人。而把这些过滤利用filter来做,速度一下子就上来了,每个查询就在几毫秒级。虽然好像还是不够理想,但暂时已经足够用了。进一步的优化可以放在后面来做。
另外很都时候需要搜索数据库的很多个字段,这样每个字段去建立一个域,然后去每个字段搜素一遍,也是很不靠谱的事情。第二篇中就清晰地指出:多域查找,在建立索引的时候放在一起,而且存储属性设置为不存储。这样既可以提高搜索效率,又对索引的大小没影响。非常好使。
No Comments Now!
Be the first to comment on this entry.