Идея состоит в том, чтобы написать сценарий, который будет вызываться каждые x минут через планировщик (например, задачу CRON). Это способ синхронизировать MySQL и Lucene. Что мне удалось сделать до сих пор:
Вот в чем я прошу вас помочь:
Вот код, который я использовал, который пытается индексировать таблицу MySQL тег (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: этот код предназначен только для целей тестирования, нет необходимости как же это ужасно :)
РЕДАКТИРОВАТЬ:
Одним из решений может быть удаление любого ранее добавленного документа и переиндексация всей базы данных:
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);
}
Я не уверен, что это самое оптимизированное решение, не так ли?