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) として DB にある日付は、次のようにインデックス化されています。

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

すべての日付値には正しい日がありますが、時間はすべて T05:00:00Z です。何が起こっているのかについての私の最善の推測は、DB から時刻を真夜中として読み取り、それを 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ファイルで、DBから日付を読み取り、タイムスタンプにキャストします。

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 に答える