Indexieren Sie eine MySQL-Datenbank mit Apache Lucene, und halten Sie sie synchronisiert

8
  1. Wenn ein neues Element in MySQL hinzugefügt wird, muss es auch von Lucene indiziert werden.
  2. Wenn ein vorhandenes Element aus MySQL entfernt wird, muss es auch aus dem Lucene-Index entfernt werden.

Die Idee besteht darin, ein Skript zu schreiben, das alle x Minuten über einen Scheduler (z. B. eine CRON-Task) aufgerufen wird. Dies ist eine Möglichkeit, MySQL und Lucene synchronisiert zu halten. Was ich bis jetzt geschafft habe:

  1. Lucene indiziert es für jedes neu hinzugefügte Element in MySQL ebenfalls.
  2. Lucene führt für jedes bereits in MySQL hinzugefügte Element keine Neuindizierung durch (keine doppelten Einträge).

Dies ist der Punkt, zu dem ich Sie um Hilfe bitten möchte:

  1. Für jedes zuvor hinzugefügte Objekt, das dann aus MySQL entfernt wurde, sollte Lucene es ebenfalls indupatieren.

Hier ist der Code, den ich verwendet habe, der versucht, eine MySQL-Tabelle tag (id [PK] | name) :

zu indizieren %Vor%

PS: Dieser Code ist nur für Testzwecke, ich brauche nicht zu sagen, wie schrecklich es ist:)

BEARBEITEN:

Eine Lösung könnte darin bestehen, jedes zuvor hinzugefügte Dokument zu löschen und die gesamte Datenbank neu zu indizieren:

%Vor%

Ich bin mir nicht sicher, ob es die am besten optimierte Lösung ist, oder?

    
sp00m 31.05.2012, 09:48
quelle

2 Antworten

7

Solange Sie die Indizierung / Neuindizierung getrennt von Ihrer Anwendung ausführen lassen, treten Synchronisierungsprobleme auf. Abhängig von Ihrem Arbeitsbereich ist dies möglicherweise kein Problem, aber für viele gleichzeitige Benutzeranwendungen ist es das.

Wir hatten die gleichen Probleme, als wir alle paar Minuten ein Jobsystem mit asynchroner Indizierung hatten. Benutzer würden ein Produkt mithilfe der Suchmaschine finden, und selbst dann, wenn eine administrative Person das Produkt aus dem gültigen Produktstapel entfernt hat, wurde es noch im Frontend gefunden, bis der nächste Reindexing-Job ausgeführt wurde. Dies führt zu sehr verwirrenden und selten reproduzierbaren Fehlern, die an den Support der ersten Ebene gemeldet werden.

Wir haben zwei Möglichkeiten gesehen: Entweder verbinden Sie die Geschäftslogik fest mit Aktualisierungen des Suchindex oder implementieren eine engere asynchrone Update-Aufgabe. Wir haben das letztere gemacht.

Im Hintergrund läuft eine Klasse in einem dedizierten Thread innerhalb der Tomcat-Anwendung, die Aktualisierungen übernimmt und sie parallel ausführt. Die Wartezeiten für Backoffice-Updates auf das Frontend sind auf 0,5-2 Sekunden gesunken, was die Probleme für die Unterstützung der ersten Ebene stark reduziert. Und es ist so locker wie möglich gekoppelt, wir könnten sogar eine andere Indexierungsmaschine implementieren.

    
0xCAFEBABE 01.06.2012, 07:35
quelle
1

Sehen Sie sich den Solr DataImportScheduler-Ansatz an.
Wenn eine Webanwendung gestartet wird, wird im Grunde ein separater Timer-Thread generiert, der regelmäßig HTTP-Post gegen Solr auslöst, der dann DataImportHandler verwendet, um Daten aus einem RDB (und anderen Datenquellen) zu extrahieren.

Da Sie also nicht Solr, sondern nur Lucene verwenden, sollten Sie sich DataImportHandler-Quelle für Ideen.

    
Marko Bonaci 01.06.2012 07:25
quelle