Nachdem ich in einem früheren Beitrag bereits die Grundladen erörtert habe, soll es hier nun um die Feinheiten und Ausnahmen beim Datenimport in den Apache Solr gehen.
Löschen vorhandener Einträge
Der DataImportHandler bietet die Möglichkeit beim Delta-Import auch Löschungen vorzunehmen. Dazu muss mit deletedPkQuery
ein entsprechende Query definiert werden. Als Rückgabe wird der unique key des zu löschenden Dokumentes erwartet.
1 2 3 4 5 |
<entity name="memory" query="..." deltaImportQuery="..." deltaQuery="..." deletedPkQuery="SELECT id FROM history WHERE action='deleted' lastModified > '${dih.last_index_time}'"> |
Splitten einer Ergebnisspalte in ein Array
Ist in der schema.xml ein Feld als multi-valued definiert müssen die Werte dafür einzeln angeliefert werden. Im Grundlagen-Artikel haben wir dazu bereits Möglichkeiten gesehen. Stehen die Werte in der Datenbank allerdings in einem Feld zum Beispiel Komma getrennt, dann müssen wir dem Solr sagen wie es getrennt werden soll.
1 2 3 4 |
<entity name="memory" transformer="RegexTransformer" query="SELECT tags,and_other_things FROM table"> <field column="tags" splitBy="\|" sourceColName="tags" /> </entity> |
Entscheidend ist zunächst einen transformer
für die entity
zu definieren. Dieser wird allerdings erst benutzt, wenn für ein Feld entsprechende Anweisungen existieren. In diesem Fall muss also explizit das Feld definiert werden. Mit splitBy
wird dann ein regulärer Ausdruck angegeben, nach dem die Trennung erfolgt. Im Beispiel wird also foo|bar
zu [foo, bar]
.
Aufteilen eines Feldes in mehrere
Durch reguläre Ausdrücken, können auch die Inhalte eines Feldes aus der Datenbank in mehrere Solr-Felder übertragen werden.
1 2 3 4 5 |
<entity name="memory" transformer="RegexTransformer" query="SELECT fullName FROM table"> <field column="firstName" regex="Mr(\w*)\b.*" sourceColName="fullName"/> <field column="lastName" regex="Mr.*?\b(\w*)" sourceColName="fullName"/> </entity> |
Hier wird als Quelle beide Male fullName
genommen. Aber jeweils ein anderer Teil extrahiert. Im Zielfeld landet was innerhalb der Klammern im regulären Ausdruck steht. Es darf somit nur ein Klammernpaar verwendet werden.
Selbiges liese sich auch auf folgende Weise lösen:
1 |
<field column="fullName" regex="Mr(\w*)\b(.*)" groupNames="firstName,lastName"/> |
Hier muss dann für jedes Klammerpaar eine Zielspalte in groupNames
in der Reihenfolge der Klammern definiert werden.