InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

Apache Lucene 2.9的改进

作者 Charles Humble 译者 赵劼 发布于 2009年10月7日

领域
架构 & 设计,
运维 & 基础架构,
语言 & 开发
主题
搜索 ,
开放源代码 ,
Java
标签
Lucene

Lucene 2.9的大部分重心放在了性能优化方面,这体现在从低端的内部基础结构改进到索引管理方式等多个方面。Lucene的索引数据库由一系列分离的“片断”组成,每个片段存放在独立的文件中。当你向索引中添加文档时,便会不断创建一些可以合并的新片断。Lucene会在FieldCache中缓存字段信息,不过在Lucene 2.4以及之前的版本中,加载字段缓存的开销相对较高,尤其在2.4版本中还会不断重新加载整个字段缓存。在发布2.9版本的准备过程中,Lucene团队意识到,在进行合并或删除的时候片断的改变频率通常比较高,不过较早的片断则更趋向于保持不变。因此,修改后的字段缓存只会加载更新过的片断。

Lucene跨片断加载FieldCache的效率也不够好。因此,2.9版本会为每个片段分别管理FieldCache,以此避开跨片断加载FieldCache的需求。这个改变的效果非常明显,Lucid Imagination的Mark Miller运行了一个简单的性能测试,表明在5,000,000个不同字符串下的情况下,Lucene 2.9相对于2.4版本会获得15倍左右的性能提高:
Lucene 2.4: 150.726s
Lucene 2.9: 9.695s

另一个显著的性能提高在于重开(re-opening)搜索的时候。Lucene 2.9引入了新的IndexWriter.getReader()方法,它可用于搜索目前完整的索引,包括当前IndexWriter会话中还没有提交的改变,这带来了接近于实时搜索的能力。此外,你还可以调用IndexWriter.setMergedSegmentWarmer()方法进行“预热”,这样那些片断便可以立即投入使用了。

另一个重大变化则是数字的处理方式,尤其是在范围查询(如“给我找出价格在0.5到9.99英镑之间的CD”)的场景下。在2.9版之前,Lucene的查询完全基于文本,因此对于数字的处理则变成了基于字符串的精确编码。这种做法经常会生成大量独立的关键字,Lucene需要通过遍历的方式来构建整个结果集。在此之前,许多开发人员使用了自定义的编码规则来应对这种情况,不过Lucene 2.9已经自带对数字的处理方式。Field和Query类会采取合适的精度进行索引和搜索,这样大大降低了需要搜索的关键字数量,使查询的响应能力得以显著提高。

2.9版本还引入了新的查询类型和适用性更广的多关键字查询(通配、前缀等等)方式,以及新的针对波斯语,阿拉伯语及中文的分析器。此外,这次更新还包括更好Unicode支持,一个新的查询分析框架,以及对地理位置的查询,它允许根据距离信息对文档进行过滤和排序(如“找出我家5英里范围内的所有干洗店”)。你可以在这里找到完整的改进列表。

一般来说,Lucene会在主要版本之间保持完整的兼容性,但是CHANGES.txt的“向后兼容策略”一节中列举了Lucene 2.9在许多地方对兼容性的破坏。对于2.9版本的升级操作很可能需要一次重新编译,合适完整的回归测试以及其它在这方面的努力。基于2.9版本的重新编译也会提示出所有即将被废弃的方法,这样开发人员便可以升级他们的应用程序,并为3.0版本作好准备。这是个明智的做法,因为Lucene 3.0会放弃对Java 1.4的支持,并且删除所有2.9版本中被标记为“deprecated”的功能。

查看英文原文:Apache Lucene 2.9 Released

译者 赵劼 网名为老赵,洋名Jeffrey Zhao,写有技术博客“老赵点滴”。关注前沿技术,并致力于开源社区与微软平台的组合优化。

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。