- 当一个新的项目在MySQL中添加,它必须也Lucene的索引。
- 当现有的项目从MySQL删除,它也必须从Lucene的索引中删除。
我们的想法是写一个脚本,将每x分钟内通过调度(例如,一个cron任务)被调用。 这是保持MySQL和Lucene的同步的方式。 我管理,直到尚未:
- 对于MySQL中的每个新添加的项目,Lucene索引它。
- 对于MySQL中的每个已添加的项目,Lucene的不重新索引它(没有重复项)。
这是我在问你一些帮助管理点:
- 对于每个先前添加的项目已经然后从MySQL删除,Lucene的也应该unindex它。
这里是我使用的代码,它试图索引一个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:这个代码是用于测试目的而已,没有必要告诉我,这是多么可怕:)
编辑:
一个解决办法是删除任何previsouly补充说明文件,并编制所有的数据库:
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);
}
我不知道这是最优化的解决方案,是吗?