Zend_Search_Lucene und Symfony - Teil 2
27.07.2007Die Daten, die in unserem Anwendungsfall indexiert werden, sind Daten, die für grundsätzliche Zwecke innerhalb der Applikation in einer Datenbank gehalten werden, z. B. der Vor- und Nachname eines Nutzers.
Das inkrementelle Aufbauen bzw. Updating des Indexes hat den Vorteil, dass die Datenbank und der Index nicht durch umfangreiche Reindexing-Prozesse zu bestimmten Zeiten zwecks Aktualisierung belastet werden. Zu indexierende Daten werden, wie im ersten Teil erwähnt, in einer Queue, eine Tabelle in der Datenbank, geparkt und von einem Batch-Script in regelmäßigen kurzen Abständen weiterverarbeitet. Somit sind lediglich kleine Datenmengen zu lesen und zu schreiben. Der Prozess ist also folgender:
- Daten in die Queue schreiben.
- Queue auslesen.
- Lucene
documentmit ausgelesenen Daten erstellen. - Anhand einer definierten ID prüfen, ob
documentfür ausgelesene Daten bereits existiert. Documentggf. aus dem Index entfernen (bzw. als deletable markieren).Documentdem Index hinzufügen.- Ausgelesene Daten aus der Queue entfernen.
Zusätzlich wird der Index in regelmäßigen Intervallen optimiert (siehe auch Teil 1).
Die Queue wird mit einer Tabelle in der Datenbank realisiert. Die Daten in der Queue bestehen lediglich aus serialisierten Objekten; deren Attribute werden letztendlich indexiert. Die Tabelle ist entsprechend simpel und bietet durch die Serialisierung dennoch absolute Flexibilität bzgl. irgendwelcher Daten:
CREATE TABLE `index_user_queue` (
`id` bigint(20) NOT NULL auto_increment,
`serialized` text collate utf8_unicode_ci,
PRIMARY KEY (`id`)
)