- Po dodaniu nowego elementu do MySQL musi on być również zindeksowany przez Lucene.
- Kiedy istniejący przedmiot zostanie usunięty z MySQL, musi zostać również usunięty z indeksu Lucene.
Chodzi o to, aby napisać skrypt, który będzie wywoływany co x minut za pośrednictwem terminarza (np. Zadania CRON). Jest to sposób na synchronizację MySQL i Lucene. Do tej pory udało mi się:Indeksuj bazę danych MySQL za pomocą Apache Lucene i synchronizuj je
- Za każdy nowy dodany element w MySQL, Lucene również go indeksuje.
- Dla każdego już dodanego elementu w MySQL, Lucene nie reindeksuje go (brak duplikatów).
Jest to punkt Pytam ci pomóc w zarządzaniu:
- Dla każdego uprzednio dodanego elementu, który został następnie usunięty z MySQL, Lucene powinny również martwi usunięciem go.
Oto kod użyłem, który próbuje indeks tabeli MySQL tag (id [PK] | name)
:
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/mydb", "root", "");
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer);
IndexWriter writer = new IndexWriter(FSDirectory.open(INDEX_DIR), config);
String query = "SELECT id, name FROM tag";
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery(query);
while (result.next()) {
Document document = new Document();
document.add(new Field("id", result.getString("id"), Field.Store.YES, Field.Index.NOT_ANALYZED));
document.add(new Field("name", result.getString("name"), Field.Store.NO, Field.Index.ANALYZED));
writer.updateDocument(new Term("id", result.getString("id")), document);
}
writer.close();
}
PS: ten kod jest tylko do testów celów, nie ma potrzeby, aby mi powiedzieć, jak straszne jest to :)
EDIT:
Jednym z rozwiązań mogłoby być usunięcia previsouly dodany dokument, a reindex całą bazę danych:
writer.deleteAll();
while (result.next()) {
Document document = new Document();
document.add(new Field("id", result.getString("id"), Field.Store.YES, Field.Index.NOT_ANALYZED));
document.add(new Field("name", result.getString("name"), Field.Store.NO, Field.Index.ANALYZED));
writer.addDocument(document);
}
Nie jestem pewien, czy jest to najbardziej zoptymalizowane rozwiązanie, prawda?
Co zrobiłeś w końcu? –