【发布时间】:2011-09-12 04:51:33
【问题描述】:
我有一个使用 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 发布版本?
【问题讨论】: