4

我正在尝试使用 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 AM (EST) 被索引为:

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

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

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

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

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

4

2 回答 2

2

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

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

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

于 2012-11-27T17:10:43.013 回答
0

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

解决方法:

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