Lucene已经发展到Lucene 7了,不过,Lucene 7是一个前瞻性的版本,其实,Lucene还在同时升级Lucene5 和Lucene6.
Lucene在之前的版本迭代中,不断尝试新的设计思想,不断引入新的与时俱进的功能。这也导致Lucene的大版本不兼容,在我之前的项目中,从Lucene2升级到Lucene4,再升级到Lucene6,都不能平滑过渡,需要修改项目中使用到Lucene的部分代码。
从Lucene 1.4.3升级到Lucene 2.1
2004年7月,Lucene发布第一个版本Lucene 1.4。多年后的2007年才发布Lucene 2,其中,Lucene 2.4.0使用的最广泛。从Lucene 1.4.3升级到Lucene 2.1,可能需要了解这些改变:
- 对Field的设计更加合理,使用内部类来区分Field的具体类型:
Field(String name,String value,boolean store,boolean index)
更改为了:
Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector)
- BooleanQuery的add方法也改了,原有的是
add(Query q, boolean required, boolean prohibited)
现在也更加面向对象了:
add(Query q, BooleanClause.Occur occur)
- QueryParser的parse方法不再是static的了,需要先获取QueryParser实例。
- IndexReader类方法签名有稍许改动。
从Lucene 2 升级到Lucene 3.x
Lucene 于2009年11月发布了 Lucene 3.0,这一版本改动了很多API,并加入了Java5的新特性:如泛型、可变参数、枚举。从Lucene 2 升级到Lucene 3.x,可能需要了解这些改变:
- 对Field的设计更加合理,使用了枚举来区分Field的具体类型:
new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS)
- IndexWriter中的很多构造函数都被移除了
- Search中的很多构造函数都被移除了
- QueryParser中的很多构造函数都被移除了
- 删除了Hits类,使用collector去获取Hits
- 索引优化,使Lucene可能近实时。
从Lucene 3.x 升级到Lucene 4.x
Lucene 于2012年10月发布了Lucene 4.0,该版本重构了Lucene,基本是Lucene划时代的产品。直接升级需要改动特别多代码,在实际操作中一般是直接使用新版本Lucene 4,只迁移数据。
- 对Field的设计更加合理,拆分了Field的各种功能:
StringField:不分词、被索引。
TextField:分词、被索引。
StoredField:不被索引,当然也不被分词。 - 扩展了打分算法:
org.apache.lucene.search.DefaultSimilarity
扩展到了
org.apache.lucene.search.similarities.*
- 通过编码器Codec机制使得Lucene索引格式与Lucene架构解耦。
- 增加了模块化API,以模块化方式提供了非结构化信息管理分析器和空间信息搜索模块。
从Lucene 4.x 升级到Lucene 5.x
Lucene 于2015年2月发布了Lucene 5.0,从Lucene 5开始,Lucene 开始考虑向前兼容。
- 所有文件的访问方法都已基于Java NIO2
- Lucene已实现了为每个segment和每次提交都存储了唯一的id,从而使得Lucene能够更加精确地实现索引文件的复制
- 在索引合并的过程中,IndexWriter总会在合并前检测已经损坏的segment,这就意味着当升级到5.0版本时,对4.X系列的索引进行合并时,会有一定的延迟