从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。