Индексируйте базу данных MySQL с помощью Apache Lucene и синхронизируйте их.

  1. Когда новый элемент добавляется в MySQL, он также должен быть проиндексирован Lucene.
  2. Когда существующий элемент удаляется из MySQL, он также должен быть удален из индекса Lucene.

Идея состоит в том, чтобы написать сценарий, который будет вызываться каждые x минут через планировщик (например, задачу CRON). Это способ синхронизировать MySQL и Lucene. Что мне удалось сделать до сих пор:

  1. Для каждого нового добавленного элемента в MySQL Lucene также индексирует его.
  2. Для каждого уже добавленного элемента в MySQL Lucene не выполняет его переиндексацию (нет повторяющихся элементов).

Вот в чем я прошу вас помочь:

  1. Для каждого ранее добавленного элемента, который затем был удален из 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);
}

Я не уверен, что это самое оптимизированное решение, не так ли?

9
задан sp00m 31 May 2012 в 09:58
поделиться