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

chu*_*ubs 14 java lucene

我有一个使用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 );
Run Code Online (Sandbox Code Playgroud)

后:

return NumericRangeFilter.newLongRange("dateArchived-stored", 
                                       start.getTime(), 
                                       end.getTime(), true, true );
Run Code Online (Sandbox Code Playgroud)

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

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

之前:

new IndexWriter( indexDirectory, analyzer )
Run Code Online (Sandbox Code Playgroud)

后:

new IndexWriter( FSDirectory.open(indexDirectory), analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED )
Run Code Online (Sandbox Code Playgroud)

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

之前:

new Sort("timestamp", false )
Run Code Online (Sandbox Code Playgroud)

后:

new Sort(new SortField("timestamp", SortField.LONG, false) )
Run Code Online (Sandbox Code Playgroud)

这是否适用于2.2.x中内置的索引,但是由2.9.x读取?

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

mih*_*icc 1

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

如果您有字符串字段,则不能在它们上使用数字范围。这个你可以自己检查一下。