从Solr DataImportHandler中的Oracle日期获取正确的时间
我正在尝试使用Solr的DataImportHandler来索引来自Oracle DB的一些文档,除了正确读取Oracle Date列到我的文档中之外,一切正常。
我将Solr模式中的字段定义为
我首先尝试在DataImportHandler中仅对日期列执行基本的select语句,但所有日期都使用不正确的时间值进行索引。 例如,2004年1月12日上午09:28(美国东部时间)在DB中的日期被索引为:
2004-01-12T05:00:00Z
所有日期值都有正确的日期,但它们都有T05:00:00Z作为时间。 我最好的猜测是,它正在将数据库中的时间读取为午夜并将其转换为UTC。 如果是这种情况,我希望正确的值读取T14:28:00Z。
为什么不拿起数据库列的时间部分? 我知道DIH附带的日期变换器 ,但我不清楚它应该如何工作。 我也尝试过
在DIH,但似乎没有任何改变。
这是完整的代码与最后的答案(为了更加清晰)。
在您的data-config.xml文件中,从DB读取日期并转换为时间戳:
select cast(STRT_DT as timestamp) as STRT_DTTS from DATES
放入DataImportHandler实体,如下所示:
此查询将返回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
:
现在应该包含正确的日期。
Oracle JDBC getDate()将仅返回date part.Only getTimeStamp()返回Date和Time部分。
解决方法:
- 添加cast()函数将日期转换为时间戳,因此solr将获得oracle.TIMESTAMP对象。 例如:CAST(release_date AS TIMESTAMP)AS d_release_date,
- 添加新的日期转换器以将TIMESTAMP转换为日期。
- 瞧! 现在你有时间参与solr。