【问题标题】:Getting correct time from Oracle date in Solr DataImportHandler在 Solr DataImportHandler 中从 Oracle 日期获取正确时间
【发布时间】:2012-04-11 18:07:41
【问题描述】:

我正在尝试使用 Solr 的 DataImportHandler 为 Oracle DB 中的一些文档编制索引,除了将 Oracle 日期列正确读取到我的文档中之外,一切正常。

我的 Solr 架构中的字段定义为

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

我首先尝试在我的 DataImportHandler 中仅对日期列执行一个基本的选择语句,但是所有日期的索引都使用了不正确的时间值。例如,数据库中的日期为 2004 年 1 月 12 日 09:28 AM (EST) 被索引为:

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

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

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

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

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

【问题讨论】:

  • Oracle中字段的类型是什么?
  • Oracle中字段的数据类型是Date。
  • nls_date_format 设置为什么?另外,如果你只做'select sysdate from dual',你会得到什么?

标签: java oracle solr


【解决方案1】:

这是最后一个答案的完整代码(为了更加清晰)。

在您的 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" />

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

【讨论】:

    【解决方案2】:

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

    解决方法:

    • 添加 cast() 函数将日期转换为时间戳,因此 solr 将获取 oracle.TIMESTAMP 对象。 例如:CAST(release_date AS TIMESTAMP) AS d_release_date,
    • 添加新的日期转换器以将 TIMESTAMP 转换为日期。
    • 瞧!现在你有时间参与 solr。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 2018-05-19
      • 1970-01-01
      相关资源
      最近更新 更多