通过Java中的多个主要版本以编程方式升级Lucene索引

通过Java中的多个主要版本以编程方式升级Lucene索引,java,indexing,lucene,upgrade,Java,Indexing,Lucene,Upgrade,我正在编写一个实用程序,用Java从3.6.2升级Lucene索引。Lucene的IndexUpgrader仅适用于上一个主要版本。目前6.6.0是最新版本。这意味着我必须通过连续的主要版本(3到4,4到5,最后5到6)升级索引 这涉及到运行Lucene的IndexUpgrader的多个版本。不幸的是,IndexUpgrader打包在Lucene jar中的同一位置,但考虑到多个版本: Lucene v4.9.1 : org.apache.lucene.index.IndexUpgrader L

我正在编写一个实用程序,用Java从3.6.2升级Lucene索引。Lucene的IndexUpgrader仅适用于上一个主要版本。目前6.6.0是最新版本。这意味着我必须通过连续的主要版本(3到4,4到5,最后5到6)升级索引

这涉及到运行Lucene的IndexUpgrader的多个版本。不幸的是,IndexUpgrader打包在Lucene jar中的同一位置,但考虑到多个版本:

Lucene v4.9.1 : org.apache.lucene.index.IndexUpgrader
Lucene v5.5.4 : org.apache.lucene.index.IndexUpgrader
Lucene v6.6.0 : org.apache.lucene.index.IndexUpgrader
……等等。未来的版本可能会遵循这种模式


我的问题是,我可以在我的应用程序中包含3个不同版本的Lucene,并在不将Lucene源代码复制到包结构的情况下实例化一个特定版本的IndexUpgrader吗?如果是这样的话,如何升级?

我有充分的权威(Lucene项目中真正聪明的开发人员)认为,升级多个主要版本时,兼容性是不保证的。也就是说,如果您从版本5.x.x开始,将索引升级为6.x.x版本,然后尝试在版本7中使用该索引,则绝对不能保证该索引能够工作


因此,即使您知道如何欺骗类加载,以便在应用程序中使用多个版本的Lucene并使整个想法发挥作用,结果索引也可能无法工作。

IndexUpgrader设计为作为命令行工具运行。为什么不用简单的方法编写一个shell脚本呢?好问题!解决方案需要独立于平台,我认为可以通过几种不同的方式实现。我们最终使用了Maven的阴影功能来移动Lucene 4和5,这样它们就不会干扰Lucene 6。然后升级成功了,但是我们失去了在升级的索引中搜索存储为数字的日期的能力。最后,我们对Lucene 3进行了着色以供此索引使用,并继续前进。非常好的反馈-感谢分享!在您的示例中,这是一个有趣的反馈-如果索引也升级到7会怎么样?它会工作吗?如果你通过一个以上的主要版本,兼容性是不能保证的。在较新的版本中,第一次写入段的Lucene版本记录在索引数据中,即使数据被较新的版本重写,Lucene仍将知道最初创建的版本。我有理由相信,我上面所说的“可能行不通”在新版本中已经变成了明确的“肯定行不通”。我没有任何确凿的证据来证明这一点。