2012-04-11 60 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" /> 

現在應該包含正確的日期。

相關問題