- Cuando se añade un nuevo elemento en MySQL, debe ser también un índice por Lucene.
- Cuando un elemento existente se elimina de MySQL, también debe eliminarse del índice de Lucene.
La idea es escribir un script que se llamará cada x minutos a través de un planificador (por ejemplo, una tarea CRON). Esta es una forma de mantener sincronizados MySQL y Lucene. Lo que logré hasta ahora:Índice de una base de datos MySQL con Apache Lucene, y mantenerlos sincronizados
- Por cada nuevo elemento añadido en MySQL, Lucene lo indexa también.
- Para cada elemento ya agregado en MySQL, Lucene no lo reindexa (no hay elementos duplicados).
Este es el punto que te pido un poco de ayuda para gestionar:
- Para cada elemento añadido previamente que se ha retirado luego de MySQL, Lucene también debe unindex ella.
Aquí está el código que utilicé, que trata de indexar una tabla de 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: este código es para propósitos pruebas solamente, no hay necesidad de que me diga lo terrible que es :)
EDIT:
Una solución podría ser la de eliminar cualquier documento añadido previsouly y indexar toda la base de datos:
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);
}
No estoy seguro de que sea la solución más optimizada, ¿o sí?
¿Qué terminaste haciendo? –