关于将Lucene从2.2升级到2.9再到3.1的问题

2022-09-04 04:56:02

我有一个使用Lucene 2.2.x的现有软件,我需要升级到3.1。要进行此升级,我已阅读了建议先升级到 2.9.x 的文档,删除所有弃用警告,然后升级到 3.1.x。我已经部署了现有的索引,我需要保持代码兼容。

我的主要问题来自处理日期。在2.2.x中,我不得不使用DateTools.dateToString()将Date.getTime()转换为可以索引和存储的字符串。我在每个文档上创建了两个字段。一个用于搜索,以小时分辨率存储,另一个字段未分析。现在Lucene 2.9.x支持字符串以外的其他数据类型。如果这些新类型与使用 DateTools 将日期转换为字符串的先前版本相对应,是否可以在 RangeQueries 中使用?以下是我也更改了它的代码:

以前:

return new RangeFilter("dateArchived-stored",
                DateTools.dateToString(start, DateTools.Resolution.MILLISECOND),
                DateTools.dateToString(end, DateTools.Resolution.MILLISECOND),
                false, true );

后:

return NumericRangeFilter.newLongRange("dateArchived-stored", 
                                       start.getTime(), 
                                       end.getTime(), true, true );

既然 Lucene 支持非字符串数据类型,我们是否需要像使用 Term 查询那样关注日期的解析?

IndexWriter 需要声明一个 MaxFieldLimit。以前的版本没有。使用 UNLIMITED 的行为是否与先前版本的行为相同?鉴于我将阅读的索引是使用2.2创建的,因此使用UNLIMITED是最安全的吗?

以前:

new IndexWriter( indexDirectory, analyzer )

后:

new IndexWriter( FSDirectory.open(indexDirectory), analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED )

排序对象需要 SortField 声明,该声明需要该字段的类型。对于使用 2.2.x 版本编制索引的现有字段,我们是否可以将以前索引为 String 的字段声明为另一种类型的字段,或者它们应始终为 SortField.STRING?

以前:

new Sort("timestamp", false )

后:

new Sort(new SortField("timestamp", SortField.LONG, false) )

这是否适用于在 2.2.x 中构建但由 2.9.x 读取的索引?

最后,使用2.2.x内置的索引直接进入3.1.x会有什么问题吗?我将在我的本地开发系统上过渡到2.9.x,但在现场,它将从2.2.x直接过渡到3.1.x。我是否必须发布使用 2.9.x 的版本?


答案 1

“使用UNLIMITED是最安全的吗”。是的。该选项与已创建的文档无关。

如果您有字符串字段,则不能对它们使用数值范围。您可以自行检查。


答案 2

推荐