Исключение при обновлении индекса Lucene - PullRequest
4 голосов
/ 08 мая 2009

Я новичок в поисковом API Lucene. При обновлении индекса Lucene я получаю следующее исключение ... почему я получаю эту ошибку и как ее избежать?

System.IO.IOException: Lock obtain timed out: SimpleFSLock@C:\Indexes\write.lock
   at Lucene.Net.Store.Lock.Obtain(Int64 lockWaitTimeout)
   at Lucene.Net.Index.IndexWriter.Init(Directory d, Analyzer a, Boolean create, Boolean closeDir)
   at Lucene.Net.Index.IndexWriter.Init(String path, Analyzer a, Boolean create)
   at Lucene.Net.Index.IndexWriter..ctor(String path, Analyzer a, Boolean create)

Спасибо за чтение.

Ответы [ 3 ]

11 голосов
/ 08 мая 2009

Lucene создает файл блокировки при открытии индекса в режиме записи. Этот файл блокировки удаляется при чистом закрытии индекса. Во время записи индекса, если программа завершает работу без закрытия lucene IndexWriter, вы получите это исключение в следующий раз при попытке записи в него. Если вы удалите файл блокировки из каталога индекса, вы не увидите это исключение.

Вы можете отключить блокировку с помощью FSDirectory.setDisableLocks (false) , но это не рекомендуется, так как ошибки игнорируются без уведомления.

1 голос
/ 08 мая 2009

Я думаю, что вы также можете получить эту ошибку, если запись в индекс занимает больше времени, чем значение тайм-аута, и после окончания блокировки и до завершения записи в индекс выполняется другая запись индекса - по крайней мере, казалось, что именно это и происходило. 1001 *

У меня возникла та же проблема, когда я начал приближаться к 50% или более от максимального количества файлов в одном каталоге Windows. Это замедлило запись достаточно, чтобы вызвать проблему. (Win2k3)

Я считаю, что вы можете перекомпилировать Lucene, чтобы изменить значение тайм-аута.

0 голосов
/ 24 сентября 2012

Попробуйте следующее:

try
{
    writer = new IndexWriter(directory, new StandardAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
}
catch (LockObtainFailedException ex)
{
    DirectoryInfo indexDirInfo = new DirectoryInfo(directory);
    FSDirectory indexFSDir = FSDirectory.Open(indexDirInfo, new Lucene.Net.Store.SimpleFSLockFactory(indexDirInfo));
    IndexWriter.Unlock(indexFSDir);
    writer = new IndexWriter(directory, new StandardAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
}
...