- Quando un nuovo elemento viene aggiunto in MySQL, deve essere indicizzato anche da Lucene.
- Quando un elemento esistente viene rimosso da MySQL, deve essere rimosso anche dall'indice di Lucene.
L'idea è di scrivere uno script che verrà chiamato ogni x minuti tramite uno scheduler (ad esempio un'attività CRON). Questo è un modo per tenere sincronizzati MySQL e Lucene. Quello che ho gestito fino ad ora:Indicizzare un database MySQL con Apache Lucene e tenerli sincronizzati
- Per ogni nuovo elemento aggiunto in MySQL, Lucene lo indicizza anche.
- Per ogni elemento già aggiunto in MySQL, Lucene non lo reindicizza (nessun elemento duplicato).
questo è il punto che vi chiedo un aiuto per gestire:
- Per ogni elemento aggiunto in precedenza che è stato poi rimosso da MySQL, Lucene dovrebbe anche unindex esso.
Ecco il codice che ho usato, che cerca di indicizzare una tabella di 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: questo codice è per le prove solo scopo, non c'è bisogno di dirmi come terribile è :)
EDIT:
una soluzione potrebbe essere quella di eliminare qualsiasi documento previsouly aggiunto e reindex tutto il database:
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);
}
Non sono sicuro che sia la soluzione più ottimizzata, vero?
Cosa hai finito? –