写点什么

Apache Lucene 2.9 的改进

  • 2009-10-07
  • 本文字数:1267 字

    阅读完需:约 4 分钟

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

2009-10-07 12:533069
用户头像

发布了 157 篇内容, 共 50.5 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

在线研讨会邀请 | 赋能“大”研发,助力“快”交付

龙智—DevSecOps解决方案

版本控制 线上研讨会 研讨会 数字资产管理

JVM说--直接内存的使用

京东科技开发者

JVM io nio 虚拟机 企业号 2 月 PK 榜

舞台LED显示屏对灯光设计产生了哪些影响

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家

如何在 Web 端实现一个多人数独游戏

声网

Vue 互动白板 RTE

【SOP】新扩容节点与集群版本不一致处理

TiDB 社区干货传送门

实践案例 版本升级 管理与运维 故障排查/诊断 扩/缩容

【2.3-2.10】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

2023最好用的10个开发者工具!每一个都让你效率翻倍

popo223344

工具 测试 后端

剖析字节案例,火山引擎A/B测试DataTester如何“嵌入”技术研发流程

字节跳动数据平台

大数据 AB testing实战 企业号 2 月 PK 榜

TiKV RocksDB读写原理整理

TiDB 社区干货传送门

TiDB 底层架构 TiKV 底层架构

云数据库 TiDB 试用实践——部署&运维

TiDB 社区干货传送门

版本测评

br备份时排除某个库

TiDB 社区干货传送门

实践案例 备份 & 恢复

Apipost如何快速生成并分享API实时文档

popo223344

后端

云端智创 | 基于视频AI原理的音视频智能处理技术

阿里云视频云

云计算 音视频

MASA Stack 1.0 发布会讲稿——实践篇

MASA技术团队

.net MASA MAUI MASA Stack

代码质量与安全 | 开发人员必备的安全编码实践指南

龙智—DevSecOps解决方案

代码安全 静态代码扫描

迈铸半导体完成1500万Pre A+轮融资,用于实现规模化量产

硬科技星球

Fastjson踩“坑”记录和“深度”学习

阿里技术

Fastjson

ITSM | 限时优惠,帮助您的团队终结不良服务管理!

龙智—DevSecOps解决方案

Jira ITSM IT服务管理

选择等保测评机构需要注意的几个点-行云管家

行云管家

等保 等级保护 等保测评

Apipost参数描述的填写和参数描述库的使用

爱研究代码的极客人

Postman 参数 参数定义 apipost

全板电镀与图形电镀,到底有什么区别?

华秋电子

PCB PCB生产

七年的开源商业化探索,PingCAP 为什么选了这样一条路?

TiDB 社区干货传送门

数据库前沿趋势

# 文盘Rust -- rust 连接云上数仓 starwift

TiDB 社区干货传送门

开发语言

PingCAP黄东旭:Serverless是数据库的未来形态

TiDB 社区干货传送门

数据库前沿趋势

龙智宣布与Incredibuild建立战略合作伙伴关系

龙智—DevSecOps解决方案

DevSecOps 加速编译

带你动手做AI版的垃圾分类

华为云开发者联盟

人工智能 华为云 企业号 2 月 PK 榜 华为云开发者联盟 垃圾分类

云数据库 TiDB试用

TiDB 社区干货传送门

云数据库 TiDB 体验——部分故障问题与解决方法

TiDB 社区干货传送门

版本测评 新版本/特性解读 6.x 实践

产研指南针的量化指标实践笔记

车江毅

项目管理 研发管理 降本增效 北极星指标 效能度量

模型推理耗时降低98%!PaddleTS又双叒叕带来重磅升级!

飞桨PaddlePaddle

paddle

模块1作业

抹茶柠檬

架构实战营

  • 扫码加入 InfoQ 开发者交流群
Apache Lucene 2.9的改进_Java_Charles Humble_InfoQ精选文章