Как мне сохранить индекс lucene в базе данных? - PullRequest
3 голосов
/ 04 февраля 2009

Это мой пример кода:

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 ]

4 голосов
/ 04 февраля 2009

Кажется, что индекс заблокирован. Если вы уверены, что он не должен быть заблокирован, возможно, произошел сбой какого-либо процесса без надлежащей очистки.

Попробуйте добавить строку

jdbcDir.clearLock();

перед созданием indexWriter.

Не оставляй это там, жестко. Как правило, вы хотите, чтобы Lucene управлял блокировками, чтобы запретить двум IndexWriters выполнять запись в один и тот же индекс.

0 голосов
/ 19 января 2012

Сначала вы должны создать таблицу.

Попробуйте использовать такой код:

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

Замки сделаны IndexWriter. Если что-то не так, блокировка не снимается, поэтому вам нужно снять все блокировки перед созданием нового модуля записи (есть статический метод класса IndexWriter)

IndexWriter.unlock(dir);
...