2017-06-08 1 views
1

Ich arbeite an einem Solr dataimport aus einer Oracle-Datenbank. Das Datenbanksystem verfügt über eine Reihe von Tabellen, in denen Verweise auf Änderungen in anderen Tabellen gespeichert werden. Zum Beispiel könnte ich eine Tabelle mit dem Namen PERSON haben, und wenn Datensätze zu dieser Tabelle hinzugefügt werden, werden ihre IDs der PERSON_CHANGED Tabelle hinzugefügt. Ich möchte diese Tabelle PERSON_CHANGED bei der Definition meiner deltaQuery verwenden, so dass Solr nur die geänderten Datensätze in nachfolgenden Indizes indiziert. Als Teil dieses Prozesses muss ich die Datensätze, die ich aus der Tabelle PERSON_CHANGED gelesen habe, entfernen, nachdem Solr den Import beendet hat (entweder Delta oder Voll), damit ich sie später nicht mehr verarbeiten kann.Führen Sie DELETE Bereinigungsabfrage nach einem Solr-Datenimport

Was ist der beste Weg, um diese Art von "Bereinigung" SQL-Abfrage nach einem dataimport auszuführen?

Ich habe versucht, sowohl die Abfragen wie folgt kombiniert (der Kürze halber vereinfacht):

<dataConfig> 
    <dataSource ... > 
    <document> 
     <entity name="person" 
       query=" 
        SELECT ID, FIRST_NAME, LAST_NAME 
        FROM PERSON 
        WHERE '${dataimporter.request.clean}' != 'false' 
         OR PERSON_ID IN (
          SELECT ID FROM CHANGED_PERSON 
         ); 

        DELETE * (
         SELECT * FROM CHANGED_PERSON 
        ); 
     " /> 
    </document> 
</dataConfig> 

Aber dies führt zu einem SQL command not properly ended Fehler. Bietet Solr eine Möglichkeit, diese Art der Säuberung durchzuführen?

+0

Hallo, was ist deine SOLR-Version? – jeorfevre

+0

@jeorfevre - Ich benutze Solr 6.5.1. –

+0

Ihre Delete-Anweisung gibt nicht an, welche Tabelle zum Löschen verwendet wird, DELETE-Person, wo person_id in ( SELECT ID VON CHANGED_PERSON); –

Antwort

0

Ich habe einen Weg gefunden, diese Säuberungsaufgabe zu erledigen, aber ich bin nicht sehr glücklich damit. Ich kann eine separate Einheit, deren Abfrage definieren läuft eine DELETE:

<dataConfig> 
    <dataSource ... > 
    <document> 
     <entity name="person" 
       query=" 
        SELECT ID, FIRST_NAME, LAST_NAME 
        FROM PERSON 
        WHERE '${dataimporter.request.clean}' != 'false' 
         OR PERSON_ID IN (
          SELECT ID FROM CHANGED_PERSON 
         )" /> 

     <entity name="deleteChangedPersonRecords" 
       query="DELETE FROM CHANGED_PERSON" /> 
    </document> 
</dataConfig> 

Dies scheint zu funktionieren, aber es ist ein bisschen wie ein Hack, und es beruht auf der Annahme, dass Solr seine Entitätsabfragen in der gleichen Reihenfolge ausgeführt, dass sie sind in der Datei angegeben. Wenn jemand eine bessere Lösung hat, können Sie gerne Ihre Antwort zu dieser Frage hinzufügen.

0

Sobald Sie Delta Import in SOLR verwenden, solr nicht zweimal Ihren Eintrag verarbeiten, da Sie den Überblick behalten wird dieser jedes Mal erfasst werden Sie

Ref doc laufen:

Wenn Delta-Import-Befehl ausgeführt wird, liest es die Startzeit in conf/dataimport.properties.

Link: https://wiki.apache.org/solr/DataImportHandler#Delta-Import_Example

Als Teil Ihrer Frage kann ich mir vorstellen, dass Sie versuchen, jedes Mal voll Import auszuführen, dass Sie die deltaimport laufen (Voll Import läuft Bereinigung in solr Indizes ... etc). Dies ist nicht der richtige Weg, Deltaimport zu machen.

Was würde ich Sie empfehlen ist: 1) durchführt Delta Import (und nicht die volle Bedeutung) 2) einmal alle X Tage, X Monat, wenn Ihre Notwendigkeit, führen Sie einen sauberen Import besser es in einem anderes zu tun Kern, damit Ihr Dienst weiterläuft und Sie nur die Kerne ersetzen.

+0

Danke für die Antwort! Ich denke, die Startzeit ist nur relevant, wenn Sie sie in die Abfrage einbauen, wie sie es in ihrem Beispiel tun (wenn sie '$ {dih.last_index_time} '' verwenden). Ich verwende nicht den Zeitstempel, um zu bestimmen, was meine Deltas sind - stattdessen benutze ich meine Tabelle 'CHANGED_PERSON'. Mein Plan, einmal einen vollständigen Import auszuführen, und dann nachfolgende Importe, verwenden diese 'CHANGED_PERSON'-Tabelle, um festzustellen, was noch nicht indiziert wurde. Deshalb muss ich nach einem Import aus dieser Tabelle löschen können. –

+0

Warum nicht einen Zeitstempel in Ihrer PERSON-Tabelle verwenden und TABLE CHANGED_PERSON löschen, damit Sie somr delta mecanics auf einfache Weise verwenden können. Brauchen Sie die Tabelle CHANGED_PERSON? – jeorfevre

+0

Ich stimme Ihnen zu, dass es einfacher wäre, einen Zeitstempel auf der 'PERSON'-Tabelle zu verwenden, wie Sie vorschlagen, aber es gibt zahlreiche Gründe, warum wir dieses' CHANGED_PERSON'-System verwenden - hauptsächlich aufgrund von Legacy-Bedenken und anderen Systemen, mit denen es interagiert diese Tabellen. –

Verwandte Themen