我正在尝试使用 Solr 的 DataImportHandler 从 Oracle DB 中索引一些文档,除了将 Oracle Date 列正确读取到我的文档中之外,一切工作正常。
我的 Solr 架构中的字段定义为
<field name="release_date" type="date" indexed="true" stored="true" multiValued="false"/>
我首先尝试在 DataImportHandler 中仅执行日期列的基本选择语句,但所有日期都使用不正确的时间值进行索引。例如,数据库中的日期为 2004 年 1 月 12 日上午 09:28(美国东部标准时间),其索引为:
<date name="release_date">2004-01-12T05:00:00Z</date>
所有日期值都有正确的日期,但它们的时间都是 T05:00:00Z。我对正在发生的情况的最佳猜测是,它从数据库读取时间为午夜并将其转换为 UTC。如果是这种情况,我希望正确的值是 T14:28:00Z。
为什么它不获取数据库列的时间部分?我知道有一个日期转换器 http://wiki.apache.org/solr/DataImportHandler#DateFormatTransformer这是 DIH 附带的,但我不太清楚它是如何工作的。我也尝试过做
<field column="RELEASE_DATE" name="release_date" dateTimeFormat="yyyy-MM-dd'T'hh:mm:ss'Z'" />
在 DIH 中,但这似乎并没有改变任何事情。
这是与最后一个答案一起使用的完整代码(为了更加清晰)。
在 data-config.xml 文件中从数据库读取日期并转换为时间戳:
select cast(STRT_DT as timestamp) as STRT_DTTS from DATES
放入 DataImportHandler 实体中,如下所示:
<entity name="startDate" transformer="script:startDateTransform"
query="select cast(STRT_DT as timestamp) as STRT_DTTS from DATES" >
<field column="STRT_DTTS" name="STRT_DT" />
</entity>
此查询将返回 oracle.sql.TIMESTAMP,但它不会直接映射到日期。因此需要一个脚本转换器。因此我们介绍script:startDateTransform
。在同一个 data-config.xml 中,您可以像这样插入 JavaScript:
function startDateTransform(row){
// Get the timestamp and convert it to a date
var dateVal = row.get("STRT_DTTS").dateValue();
// Put the correct date object into the original column
row.put("STRT_DTTS", dateVal);
return row;
}
在这里,我们将时间戳转换为日期,更新列值并返回包含新信息的行。
场STRT_DT
:
<field column="STRT_DTTS" name="STRT_DT" />
现在应该包含正确的日期。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)