如何将lucene索引存储在数据库中?

时间:2009-02-04 07:16:02

标签: mysql lucene compass-lucene

这是我的示例代码:

MysqlDataSource dataSource = new MysqlDataSource();

dataSource.setUser("root");
dataSource.setPassword("ncl");
dataSource.setDatabaseName("userdb");
dataSource.setEmulateLocators(true); //This is important because we are dealing with a blob type data field
try{    
    JdbcDirectory jdbcDir = new JdbcDirectory(dataSource, new MySQLDialect(), "tttable");
    StandardAnalyzer analyzer = new StandardAnalyzer();
    IndexWriter writer = new IndexWriter(jdbcDir, analyzer,false);
    writer.optimize();
    writer.close();
}catch(Exception e){
System.out.print(e);
}

我被困在这一行:IndexWriter writer = new IndexWriter(jdbcDir, analyzer,false);

每次我尝试运行此代码时,都会收到以下异常:

  

------“org.apache.lucene.store.LockObtainFailedException:   锁获得超时:   PhantomReadLock [write.lock / tttable]“------------

我找不到代码有什么问题。可能是jar兼容性问题。

我无法获得IndexWriter对象。

2 个答案:

答案 0 :(得分:4)

似乎索引已被锁定。如果您确定它不应该被锁定,那么可能有一些进程在没有正确清理的情况下崩溃。

尝试添加行

jdbcDir.clearLock();

在创建indexWriter之前。

不要把它留在那里,坚韧。您通常希望让Lucene管理锁,禁止两个IndexWriters写入相同的索引。

答案 1 :(得分:0)

您应首先创建表格。

尝试使用这样的代码:

if (!dir.tableExists())
    {
        dir.create();
    }

锁由IndexWriter制作。如果出现错误,则锁定未释放,因此您需要在创建新编写器之前释放所有锁定(存在IndexWriter类的静态方法)

IndexWriter.unlock(dir);