2012-04-11 83 views
4

我想使用Solr的DataImportHandler从Oracle数据库索引一些文件,并且一切正常工作正常阅读Oracle日期列到我的文档的异常。从Oracle日期获取正确的时间在Solr DataImportHandler

我有场定义为

<field name="release_date" type="date" indexed="true" stored="true" multiValued="false"/> 

我第一次尝试这样做,我DataImportHandler日期列的只是一个基本的select语句我Solr模式,但所有的日期正在用不正确的时间值索引。举例来说,这是在DB为2004年1月12日,日期上午9点28分(美国东部时间)被索引为:

<date name="release_date">2004-01-12T05:00:00Z</date> 

所有的日期值有正确的一天,但他们都有T05 :00:00Z作为他们的时间。对于发生的事情我最好的猜测是它从午夜时间读取数据库的时间并将其转换为UTC。如果是这种情况,我希望正确的值读取T14:28:00Z。

为什么它不拾取数据库列的时间部分?我知道DIH附带有一个transformer for dates,但我不完全清楚它应该如何工作。我也试过

<field column="RELEASE_DATE" name="release_date" dateTimeFormat="yyyy-MM-dd'T'hh:mm:ss'Z'" /> 

在DIH中,但那似乎没有改变任何东西。

+0

Oracle中该字段的类型是什么? – 2012-04-11 18:23:49

+0

Oracle中字段的数据类型是Date。 – dwc86 2012-04-11 18:31:10

+0

什么是nls_date_format设置为?另外,如果你只是'从双重选择sysdate',你会得到什么? – 2012-04-11 20:43:07

回答

0

Oracle JDBC getDate()将只返回日期部分。只有getTimeStamp()返回两个日期&时间部分。

解决方法:

  • 添加CAST()函数来转换日期戳,所以Solr的将获得oracle.TIMESTAMP对象。 例如:CAST(release_date AS TIMESTAMP)AS d_release_date,
  • 添加一个新的日期转换器以将TIMESTAMP转换为日期。
  • 瞧!现在你有时间参与solr了。
2

下面是完整的代码与最后一个答案一起去(为了更清晰)。

在您的数据-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。在相同的数据-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" /> 

现在应该包含正确的日期。