- MySQLに新しいアイテムを追加するときは、Luceneによってインデックスを作成する必要があります。
- 既存のアイテムをMySQLから削除する場合は、Luceneのインデックスからも削除する必要があります。
アイデアは、スケジューラー(CRONタスクなど)を介してx分ごとに呼び出されるスクリプトを作成することです。これは、MySQLとLuceneの同期を維持する方法です。私がまだ管理していたこと:
- MySQLに新しく追加されたアイテムごとに、Luceneもインデックスを作成します。
- MySQLにすでに追加されているアイテムごとに、Luceneはインデックスを再作成しません(重複するアイテムはありません)。
これは私があなたに管理するためのいくつかの助けを求めているポイントです:
- 以前に追加され、その後MySQLから削除されたアイテムごとに、Luceneもインデックスを解除する必要があります。
これが私が使用したコードで、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:このコードはテストのみを目的としています。どれほどひどいのか教えてください:)
編集:
1つの解決策は、以前に追加されたドキュメントを削除し、すべてのデータベースのインデックスを再作成することです。
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);
}
それが最も最適化されたソリューションかどうかはわかりませんね。