2012-04-11 14 views
4

Ich versuche, Solr DataImportHandler zu verwenden, um einige Dokumente von einer Oracle DB zu indizieren, und alles funktioniert einwandfrei mit Ausnahme des korrekten Lesens einer Oracle Date-Spalte in mein Dokument.Die richtige Zeit von Oracle-Datum in Solr DataImportHandler

Ich habe das Feld in meinem Solr-Schema definiert als

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

Ich versuchte zunächst nur eine einfache select-Anweisung der Datumsspalte in meinem DataImportHandler tun, aber alle die Termine werden mit falschen Zeitwerte indiziert . Zum Beispiel ein Datum, das in der DB als Januar 12, 2004 9.28 (EST) indiziert wird als:

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

alle Datumswerte den richtigen Tag haben, aber sie alle haben T05 : 00: 00Z als ihre Zeit. Meine beste Vermutung, was passiert ist, dass es die Zeit von der DB als Mitternacht liest und sie in UTC umrechnet. Wenn dies der Fall ist, würde ich erwarten, dass der korrekte Wert T14: 28: 00Z lautet.

Warum wird der Zeitabschnitt der DB-Spalte nicht abgerufen? Ich weiß, dass es eine transformer for dates gibt, die mit der DIH kommt, aber ich bin nicht ganz klar, wie es funktionieren soll. Ich versuchte auch

in der DIH, aber das schien nichts zu ändern.

+0

Was ist der Typ des Feldes in Oracle? –

+0

Der Datentyp des Feldes in Oracle ist Date. – dwc86

+0

Worauf ist das nls_date_format eingestellt? Was bekommst du auch, wenn du 'sysdate from dual' auswählst? –

Antwort

0

Oracle JDBC getDate() gibt nur Datumsteil zurück. GetTimeStamp() gibt beide Datum zurück & Zeitteil.

Umgehung:

  • hinzufügen cast() Funktion Datum zu Zeitstempel zu konvertieren, also solr erhalten oracle.TIMESTAMP Objekt. Beispiel: CAST (Freigabe_Datum AS TIMESTAMP) AS d_Release_Datum,
  • Fügen Sie einen neuen Datumstransformator hinzu, um das TIMESTAMP-Datum zu transformieren.
  • Voila !. Jetzt hast du mal einen Teil in solr.
2

Hier ist der vollständige Code, um mit der letzten Antwort (für zusätzliche Klarheit) zu gehen.

In Ihrer Daten-config.xml-Datei lesen Sie das Datum aus dem DB und werfen zu einem Zeitstempel:

select cast(STRT_DT as timestamp) as STRT_DTTS from DATES 

in eine DataImportHandler Einheit Stoßen, die wie folgt aussieht:

<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> 

Diese Abfrage wird eine oracle.sql.TIMESTAMP zurückgeben, aber es wird nicht direkt auf Datum zugeordnet. Ein Skript-Transformer ist daher erforderlich. So stellen wir script:startDateTransform vor. In der gleichen Daten-config.xml, können Sie JavaScript wie so ein:

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; 
} 

Hier haben wir den Zeitstempel zu einem Zeitpunkt, aktualisieren Sie die Spalte Wert und geben die Zeile mit den neuen Informationen umwandeln.

Das Feld STRT_DT:

<field column="STRT_DTTS" name="STRT_DT" /> 

jetzt das richtige Datum enthalten.

Verwandte Themen